今天是在做题的过程中遇到一个新的东西,也就是花指令,实在是让我毫无头绪,后面搜了 wp 才知道这个题有个花指令,需要我们把它 patch 掉

其实这道题还是个迷宫题哈哈哈,先不管它是什么题,我们继续

这个程序是一个 32 位的带 upx 壳的程序,脱完壳之后,拖到 ida pro 中查看伪代码,但是我们虽然一点进去就是 main 函数,但是这个函数并没有被 ida 给反汇编,这就是因为花指令

在 main 函数的汇编代码这里我们可以看到,有一个 jnz 指令,这个 jnz 指令就一般是花指令的特征,还有一个 jz 指令也是(其实这里我并没有很懂,我的汇编学的不是很好,到时候还得恶补 T^T),一般这种花指令的后面都会带上一个 call 指令,而这个 call 指令根本就不是一个完整的 call 指令,但是我们的 ida 还是会把它当成一个完整的指令,这就会导致 ida 的反汇编到这里就会出错,那么我们现在就要来解决它

我们先把光标移到这个 call 上,然后点开左上角 Edit 中的 patch program 中的 change byte,然后可以看到下面这个界面

其中的这个 E8 就是汇编语言 call 的机器码,就是供机器识别的代码,而我们需要做的就是把这个 call 指令改为一个空指令,也就是 nop 指令,然后 nop 指令的机器码是 90,所以我们在这里把这个 E8 改为 90 就可以了,改完之后就是下面这样子

我们发现原来的 call 指令没了,取而代之的是一条空指令 nop,这样 ida 就不会反汇编错误了

最后我们选中从 main 函数开头到结尾,然后按 P,就相当于把这个汇编代码反汇编成伪代码,然后我们就可以发现在 Function window 看到我们的 main 函数了,然后点进去按 F5 反汇编,就进入到了我们主函数的伪代码,如下

一道很简单的迷宫题,很容易知道它的方向就是 wasd,然后起点就是 * asc_408078 这一串数据,点进去得知是(7,0),终点就是 if 条件中的(5,-4)

至于迷宫图(strings window 中查看),它一共有 70 个字符,要么是 7×10 就是 10×7 哈哈哈,这里是 7 行 10 列

1
2
3
4
5
6
7
*******+**
******* **
**** **
** *****
** **F****
** ****
**********

所以 flag 就为 flag {ssaaasaassdddw}

题目来源:BUUCTF 在线评测 (buuoj.cn)——[HDCTF2019]Maze