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)}

易错点:哈密顿环需要头尾,路径中开始与结尾均需添加出发点

posted @ 2025-05-10 14:57  iHtAlgorithm  阅读(14)  评论(0)    收藏  举报