0x00
虽说这个题归属于逆向,但实际上还是偏解密。这道题目出的简直无语+大脑瘫。先看题目
0x01
就是一个压缩包,两个文件,打开其中一个就晓得是个很典型的迷宫题目了,不过搞个201*201纯纯无语。
那另外一个很显然,先丢进去,确实是调用data的
接下来就是传统操作,丢IDA(不得不说 我的逆向真实水平就是F5大法)
64位 先分析主函数,可以看到最终的flag是要md5加密的,上面有个if的判断
进去看看,这里就很显然了,走迷宫的规矩 1是墙壁0是道,以及出口最终是131,193这个点
还加了要必须经过(163,96) 啧啧
用v1 和 v2 来控制迷宫移动 中间的循环体中表示上用U代替,下用D代替,左用L代替,右用R代替
最后就是迷宫的结束条件了(果然还是得靠hxd)
、
0x02
对程序简单分析一波,要求很明显了:需要从1,1作为起点出发,且必须要经过163,96,最终到达终点131,193。最终将线路的MD5加密就是flag了。
那么这个题目关键就考察这个迷宫的脚本怎么写 那么学习数据结构的童鞋,应该都是接触过的,深度or广度?这里就不想这么多了。201*201的不好写 我们可以先写一个8*8的小迷宫模拟一下。
再不断地测试后,懒惰使我直接gpt了,稍加修改就跑起来了
import heapq
maze_file_path = "./data"
start = (1, 1) # 起点
midpoint = (163, 96) # 必过点
end = (131, 193) # 终点
directions = [(0, -1), (0, 1), (-1, 0), (1, 0)] #这里根据坐标轴 别搞错方向
def read_maze(file_path):
with open(file_path, "r") as f:
lines = f.readlines()
maze = []
for line in lines:
row = [int(cell) for cell in line.strip()]
maze.append(row)
return maze
def heuristic(node, end):
return abs(node[0] - end[0]) + abs(node[1] - end[1])
def astar(start, end, maze):
maze_height = len(maze)
maze_width = len(maze[0])
open_list = [(heuristic(start, end), start)]
heapq.heapify(open_list)
came_from = {}
g_score = {start: 0}
while open_list:
_, current = heapq.heappop(open_list)
if current == end:
path = []
while current in came_from:
path.append(get_direction_char(came_from[current][0], came_from[current][1], current[0], current[1]))
current = came_from[current]
path.reverse()
return path
for dx, dy in directions:
new_x, new_y = current[0] + dx, current[1] + dy
new_node = (new_x, new_y)
tentative_g_score = g_score[current] + 1
if 0 <= new_x < maze_width and 0 <= new_y < maze_height and maze[new_y][new_x] == 0:
if new_node not in g_score or tentative_g_score < g_score[new_node]:
came_from[new_node] = current
g_score[new_node] = tentative_g_score
f_score = tentative_g_score + heuristic(new_node, end)
heapq.heappush(open_list, (f_score, new_node))
return None
def get_direction_char(curr_x, curr_y, next_x, next_y):
if next_x - curr_x == 1:
return "R"
elif next_x - curr_x == -1:
return "L"
elif next_y - curr_y == 1:
return "D"
elif next_y - curr_y == -1:
return "U"
else:
return ""
maze_data = read_maze(maze_file_path)
path = astar(start, end, maze_data)
if path:
x = path
with open ("lhb.txt","a",encoding="utf-8") as file:
y = "".join(x)
file.write(y)
else:
print("error")
flag还是很大一坨的
直接md5即可
flag到手。
0x03
至于其他的题,hxd也直接就解出来了,毕竟像我这种菜鸡 能弄出来一道属实不易