又是一道迷宫题,而且又是华南师大的新生赛题哈哈哈哈,这道题比 19 年的要难上不少哈哈哈
依然是 32 位无壳程序,用 ida pro 打开后查看主函数
可以看出它的关键部分依然是 check 函数
我们要做的还是一样的,要找出地图在哪里,正好这个 check 函数下面有一个 map 数组,估计就在这里面了,我们点进去看,可以看到 map=v2,然后 v2 又等于 num 数组
我点开 num 数组,发现里面有很多数字,并不符合函数中的 16 个循环,这里我很疑惑,然后参考了大佬的 wp 之后才知道我们可以用 ida 的本地调试来获取这 16 次循环的 v2 值,也就是 num 数组的值,操作如下
首先我们开启 debugger 中的 debugger windows,然后找到 createmap 函数的循环,做一个断点
然后按 F9 开始调试,按 F8 一步一步的走,首先程序会弹出来运行,我们要先随便输入一个数字进去才会开始运行 createmap 函数,所以我们先随便输入一个数字,再 F8 开始调试
我们要打开 windows debugger 中的 locals 来查看这个 v2 也就是 num 数组的值,我们要手动让他进行 16 次循环,然后得到 16 个数字,最终得到的数组如下
1 | num = [0xFFFF, 0x83F7, 0xBBF7, 0xBB17, 0xBB57, 0xB857, 0xBF57, 0xBF17, 0xBFB7, 0xBFB7, 0x8611, 0xF7B5, 0xF7B5, 0x7B4, 0xFF87, 0xFFFF] |
不过在这里我想了很久,这怎么就是迷宫了呢,一对 16 进制的数字就是迷宫?不可能!再怎么说也要是 2 进制吧!然后我就用 python 把这 16 个数字全部转为 2 进制,发现真的可以,的出来的结果应该就是迷宫了!
不过,这倒数第三行少了几个数字,根据经验,在前面补 0 就行了,让它对齐,不过有的大佬的 wp 脚本跑出来前面就有 0,挺懵逼的我,我的只能自己补?
最后一步就开始走迷宫吧!咦?不对啊,wasd 走出来的结果根本不对!噢,原来是我忽略了一开始的 check 函数,我返回去看,发现这里面有这个迷宫真正的走法
不难看出,[13],[0] 这个位置就是起点了,终点就是 [13],[15] 了,这里有 l、k、h、j 四个字母,估计就是方向键了,也不难得出,k 是向上走,h 是向左走,j 是向下走,那 l 就是向右走了
最后依照这个路径走完迷宫就可以了,不过要记住是要走最短的路径噢!
(一开始我直接提交的路径,一直是 sorrrrrrrry~ 仔细看才发现它非要我们包上 flag {},不过之前用 wasd 的时候也没包 flag… 挺无语的哈哈哈哈哈)
最终 flag:flag{llllkkkhhhkkkkkkkkklllljjjjllljjljjjjjjjlllkkkklljjjl}