【BUUCTF】REVERSE-刷题记录-不一样的flag
题目信息

解题记录


根据提示,发现是个迷宫题目

回到伪代码:
v3 的内容是 “*11110100001010000101111#”,其实也就是地图数据。
1 | *1111 01000 01010 00010 111# |
共 25 个字符 + 起始 * + 结束 # 。
而在下面判断部分里,有这段关键逻辑:

1 | if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 49 ) |
这里的索引表达式:
1 | 5 * *(_DWORD *)&v3[25] - 41 + v4 |
说明:
*(_DWORD *)&v3[25]是纵坐标(即 y)v4是横坐标(即 x)- 每行的偏移是乘以 5
说明地图是 5 列一行,即 5×5 的网格!
5×5 一共 25 个格子,刚好对应字符串里除开起点 * 和终点 # 的 25 个中间字符。
把字符串 *11110100001010000101111# 看作 5×5 的网格(按行优先)
1 | (0,0) (0,1) (0,2) (0,3) (0,4) |
起点 * 在 (0,0),目标 # 在 (4,4)。字符 1 表示不可通行(程序会 exit(1)),0/* 可通行。
程序里 1 对应 up(y—),2 对应 down(y++),3 left(x—),4 right(x++)。并有边界检查(坐标必须在 0..4)。
用 BFS(或手工)找出从 (0,0) 到 (4,4) 的一条不经过 1 的最短路径,得到动作序列:
1 | down, down, down, right, right, up, up, right, right, down, down, down |
对应数字映射就是:
1 | 2 2 2 4 4 1 1 4 4 2 2 2 |
flag{222441144222}
BFS(宽度优先搜索)求路径
我们用 BFS 搜索从 *(0,0)到 #(4,4)的最短路径。

1 | # 导入双端队列,用于广度优先搜索(BFS)队列 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 末心的小博客!










