2023江苏省领航杯线上赛WP某道逆向&解密

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也直接就解出来了,毕竟像我这种菜鸡 能弄出来一道属实不易

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值