下载完附件,是一个无 后缀的文件。将其丢入winhex中查看二进制文件。
发现是一个MZ开头的文件。MZ文件是一个可执行文件。
将其进行进行python反编译。用pyinstxtractor.py反编译exe文件。
反编译后是一个文件夹,打开。可以看到可疑的文件5,struct。
这里我们需要先将文件5和struct加上后缀.pyc,因为后续需要进行.pyc反编译成.py文件(其实struct可要可不要,struct的作用就是给5.pyc补齐前面缺失的十六进制数值,将其他的正常的.pyc文件替换struct.pyc也可以,因为我发现.pyc文件的前16位数值都是一样的)。
在winhex打开两个pyc文件,将struct的前16位十六进制数复制到5.pyc开头。
在将5.pyc文件反编译成.py文件。
再用VScode打开。
将地图排列成25*25.
下来就可以写脚本找到最短路径。
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 当前位置四个方向的偏移量
path = [] # 存找到的路径def mark(maze, pos): # 给迷宫maze的位置pos标"2"表示“倒过了”maze[pos[0]][pos[1]] = 2def passable(maze, pos): # 检查迷宫maze的位置pos是否可通行return maze[pos[0]][pos[1]] == 0def find_path(maze, pos, end):mark(maze, pos)if pos == end:print(pos, end=" ") # 已到达出口,输出这个位置。成功结束path.append(pos)return Truefor i in range(4): # 否则按四个方向顺序检查nextp = pos[0] + dirs[i][0], pos[1] + dirs[i][1]# 考虑下一个可能方向if passable(maze, nextp): # 不可行的相邻位置不管if find_path(maze, nextp, end): # 如果从nextp可达出口,输出这个位置,成功结束print(pos, end=" ")path.append(pos)return Truereturn Falsedef see_path(maze, path): # 使寻找到的路径可视化for i, p in enumerate(path):if i == 0:maze[p[0]][p[1]] = "E"elif i == len(path) - 1:maze[p[0]][p[1]] = "S"else:maze[p[0]][p[1]] = 3print("\n")for r in maze:for c in r:if c == 3:print('\033[0;31m' + "*" + " " + '\033[0m', end="")elif c == "S" or c == "E":print('\033[0;34m' + c + " " + '\033[0m', end="")elif c == 2:print('\033[0;32m' + "#" + " " + '\033[0m', end="")elif c == 1:print('\033[0;;40m' + " " * 2 + '\033[0m', end="")else:print(" " * 2, end="")print()if __name__ == '__main__':maze = [[1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],[1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1],[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1],[1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1],[1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1],[1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1],[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1],[1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1],[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1],[1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1],[1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1],[1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1],[1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1],[1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1],[1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],[1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1],[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]]start = (0, 1)end = (24, 23)find_path(maze, start, end)see_path(maze, path)
使用wasd表示最短路径为:sssssddssddssaaaassssddwwddddssssssaawwaassssddssaassddddwwddssddwwwwwwwwaawwddwwwwaaaawwddwwwwddssssddwwwwddddwwddddssaassaassddddssddssaassssssddsssssss
根据python里面的内容,flag是用wasd表示的最短路径的md5值
flag:69193150b15c87d39252d974bc323217