逆向花指令入门
前言
之前 De1CTF 的 web 扩展题,当时下载扩展 IDA 打开,然后看着反编译代码就懵了,不知道是个什么逻辑。
后来才知道题目是加入了简单的花指令来干扰 IDA 的分析,看了 writeup 之后打算自己动手解一下。
分析
分析工具:IDA 7.0
下载扩展:https://raw.githubusercontent.com/De1ta-team/De1CTF2020/master/writeup/web/mixtrue/docker.zip
用 IDA 打开,按照开发 PHP 扩展的经验直接定位到 zif_Minclude 函数,F5 反编译一下,结果看到:
1 |
|
这反编译出来的代码跟印象中的 PHP 扩展代码完全不一样,回去看反编译前的指令,看到一个红色错误:
1 |
|
说明这里可能存在花指令或者其他东西影响了 IDA 的分析,可以看到 IDA 看到 call l2,将 l2 当作了一个函数,然后认为函数返回之后的下一条指令是:
1 |
|
这样一来反编译出来的代码就完全错误了,而机器执行的代码还是正常的,所以这里的花指令可以自己看汇编代码理清流程来去除,像我这样对汇编、栈和函数调用不是很熟悉的人就只能用 gdb 调试 php 扩展来看了。
修改 php.ini 加载扩展,然后 gdb 调试,要提一点的是 php 加载 so 扩展是运行时加载,所以给扩展里的函数要下断点需要在调用该函数之前让 php 停下来,比如在前面加个 var_dump 然后给 php_var_dump 下个断点,再在运行触发断点的时候给该函数下断点。
看一遍就会发现,根源就在于 call 之后的地方:
1 |
|
这里 pop 出来的其实是 call l2 之后的返回地址,即 0x245,而修改之后再入栈则相当于将返回地址改为了 0x24D,而 IDA 静态分析不会发现返回地址被更改了,所以还是 0x245 的错误地址。
所以要去除这里的花指令,就是将 0x22E 到 0x24D 的指令都 nop 掉,然后 undefined,重新创建函数。
这时会发现另一个问题:
1 |
|
定位过去看看,是一段无法识别的跳转指令,因为它的操作数需要四个字节的数据作为跳转的地址,而后面的数据已经被识别为了 next 标签的指令,这里我们将它直接 nop 掉,然后再创建。
然后发现,另外一个地址出现了同样的错误,阅读汇编代码之后会发现是个相同的花指令,去除之后再创建,可以发现创建成功了,再 F5 反编译:
1 |
|
可以看到已经是正常的代码了。
参考文章:
https://wizardforcel.gitbooks.io/re-for-beginners/content/Part-III/Chapter-50.html
https://www.52pojie.cn/thread-1068444-1-1.html
https://www.anquanke.com/post/id/208682
https://xuanxuanblingbling.github.io/ctf/pwn/2020/05/05/mixture/