Rainbom Bash Adventure
是旮旯给木,但是使用python()
引擎renpy
脚本主要内容是验证旅商问题,直接使用贪心算法
#include <iostream>
#include <climits>
#define MAX UINT_MAX
int main()
{
unsigned int distances[20][20] = {
{0, 27207933, 29257191, 30767375, 33358061, 31710853, 18267351, 28646422, 25181575, 32668955, 31721351, 31311914, 17436287, 31231519, 27398390, 26665226, 33405147, 29479064, 28859609, 32875400},
{27207933, 0, 18723267, 27461140, 27706598, 17153389, 26073565, 31907885, 30552119, 31028215, 32910477, 33323884, 31917434, 32961668, 32744601, 32930203, 33402104, 29926349, 26989354, 28354374},
{29257191, 18723267, 0, 26971581, 30094007, 26800381, 25822626, 31797481, 30354002, 29221683, 26252638, 25958512, 30021148, 26305193, 32130369, 17552296, 28667078, 30263697, 27936885, 25722954},
{30767375, 27461140, 26971581, 0, 31156816, 30331322, 28073673, 26204203, 18396217, 25838588, 16791286, 26131377, 29700497, 27798881, 33059254, 29477864, 29721951, 29439773, 27739929, 30777073},
{33358061, 27706598, 30094007, 31156816, 0, 27346875, 16937956, 32281098, 30112898, 27364910, 30685671, 33231675, 28723588, 31226010, 30541690, 25856444, 31229621, 31201226, 17392801, 27161053},
{31710853, 17153389, 26800381, 30331322, 27346875, 0, 27018180, 26738900, 28340609, 26024216, 31493000, 17879357, 33432247, 26366524, 28566084, 30498671, 27754527, 30294100, 25178897, 25771567},
{18267351, 26073565, 25822626, 28073673, 16937956, 27018180, 0, 25268124, 32590760, 27138017, 32999152, 26220279, 26204222, 27031462, 25273715, 25443122, 28617815, 27829458, 29730434, 29457736},
{28646422, 31907885, 31797481, 26204203, 32281098, 26738900, 25268124, 0, 25545320, 33382954, 31145177, 27664100, 32470009, 27768727, 27949390, 27242094, 28136501, 18433903, 31905380, 18428695},
{25181575, 30552119, 30354002, 18396217, 30112898, 28340609, 32590760, 25545320, 0, 27003713, 25437214, 31796476, 32892705, 25571056, 29517404, 29493907, 17863705, 30959457, 29889268, 30146332},
{32668955, 31028215, 29221683, 25838588, 27364910, 26024216, 27138017, 33382954, 27003713, 0, 18199400, 27564338, 29696304, 17432494, 29903977, 25517772, 27950322, 31033257, 25934690, 27689266},
{31721351, 32910477, 26252638, 16791286, 30685671, 31493000, 32999152, 31145177, 25437214, 18199400, 0, 25876546, 31958139, 27864810, 28321738, 32744171, 30132076, 26162759, 30621460, 26660593},
{31311914, 33323884, 25958512, 26131377, 33231675, 17879357, 26220279, 27664100, 31796476, 27564338, 25876546, 0, 28787506, 26446653, 18665171, 26795144, 28330910, 27423379, 31975694, 29184736},
{17436287, 31917434, 30021148, 29700497, 28723588, 33432247, 26204222, 32470009, 32892705, 29696304, 31958139, 28787506, 0, 30143172, 25912069, 18840703, 26932680, 31591461, 25437981, 31899333},
{31231519, 32961668, 26305193, 27798881, 31226010, 26366524, 27031462, 27768727, 25571056, 17432494, 27864810, 26446653, 30143172, 0, 31608667, 32254626, 33332666, 28876524, 33245767, 18585598},
{27398390, 32744601, 32130369, 33059254, 30541690, 28566084, 25273715, 27949390, 29517404, 29903977, 28321738, 18665171, 25912069, 31608667, 0, 32919698, 31369881, 17023154, 28664099, 32553702},
{26665226, 32930203, 17552296, 29477864, 25856444, 30498671, 25443122, 27242094, 29493907, 25517772, 32744171, 26795144, 18840703, 32254626, 32919698, 0, 32324337, 31222350, 27812923, 28001748},
{33405147, 33402104, 28667078, 29721951, 31229621, 27754527, 28617815, 28136501, 17863705, 27950322, 30132076, 28330910, 26932680, 33332666, 31369881, 32324337, 0, 26022470, 18709664, 29315967},
{29479064, 29926349, 30263697, 29439773, 31201226, 30294100, 27829458, 18433903, 30959457, 31033257, 26162759, 27423379, 31591461, 28876524, 17023154, 31222350, 26022470, 0, 29138946, 27237135},
{28859609, 26989354, 27936885, 27739929, 17392801, 25178897, 29730434, 31905380, 29889268, 25934690, 30621460, 31975694, 25437981, 33245767, 28664099, 27812923, 18709664, 29138946, 0, 30105348},
{32875400, 28354374, 25722954, 30777073, 27161053, 25771567, 29457736, 18428695, 30146332, 27689266, 26660593, 29184736, 31899333, 18585598, 32553702, 28001748, 29315967, 27237135, 30105348, 0}
};
unsigned int path[20];
unsigned int visited[20] = {0};
unsigned int start = 0;
unsigned int end = 0;
unsigned int count = 0;
visited[start] = 1;
path[count++] = start;
while (count < 20)
{
unsigned int minDistance = MAX;
for (unsigned int i = 0; i < 20; i++)
{
if (visited[i] == 0 && distances[start][i] < minDistance)
{
minDistance = distances[start][i];
end = i;
}
}
visited[end] = 1;
path[count++] = end;
start = end;
}
// 输出计算得到的路径
for (unsigned int i = 0; i < count; i++)
{
std::cout << path[i] << ", ";
}
std::cout << std::endl;
// 计算并输出总距离(路径中相邻城市的累积距离)
unsigned int totalDistance = 0;
for (unsigned int i = 0; i < count - 1; i++)
{
totalDistance += distances[path[i]][path[i + 1]];
}
std::cout << "Total Distance: " << totalDistance << std::endl;
return 0;
}
解得路径后,重新运行题中脚本即可
import hashlib
def xor(target, key):
out = [c ^ key[i % len(key)] for i, c in enumerate(target)]
return bytearray(out)
def key_from_path(path):
return hashlib.sha256(str(path).encode()).digest()
def check_path(path, enc_flag):
flag1 = xor(enc_flag, key_from_path(path))
flag2 = xor(enc_flag, key_from_path(list(reversed(path))))
if flag1.startswith(b"BtSCTF"):
return flag1
if flag2.startswith(b"BtSCTF"):
return flag2
return b""
if __name__ == "__main__":
# 替换为实际已知的路径,示例中假定路径为一个整数列表
path = [0, 12, 15, 2, 1, 5, 11, 14, 17, 7, 19, 13, 9, 10, 3, 8, 16, 18, 4, 6, 0]
enc_flag = bytearray(b'\xc2\x92\xf9\xf66\xe8\xa5\xa6\x17\xb6mGE\xcfQ\x90Mk:\x9a\xbb\x905&\x19\x8e\xc4\x9a\x0b\x1f\xf8C\xf4\xb9\xc9\x85R\xc2\xbb\x8d\x07\x94[R_\xf5z\x9fAl\x11\x9c\xbb\x9255\x08\x8e\xf6\xd6\x04')
flag = check_path(path, enc_flag)
if flag:
print("Flag:", flag.decode('ascii'))
else:
print("未找到合法的 flag")
#BtSCTF{YOU_are_getting_20_percent_c00ler_with_this_one_!!_B)}
易错点:哈密顿环需要头尾,路径中开始与结尾均需添加出发点