idapython初体验

近来做了许多ctf的RE题,用IDA分析确实方便,f5更是神器。但发现有些题目为了anti-f5,而对程序代码进行混淆,这样f5就无法直接反汇编回来,加大了逆向的难度。混淆有多种方式,例如加密部分代码,然后在程序运行后进行自解密。我们可以借助IDA的脚本idapython来模拟程序运行时的自解密,从而更好更方便的逆向分析。这里以hctf2015中的“一个复古的程序”[附件下载]为例子,程序是8086汇编写的,程序开始后,先异或解密后续代码。以下省略对逻辑的详细分析过程,主要表现idapython的使用。
pic1.png
按 shift+f2 弹出脚本窗口,新建个snippet,选择脚本语言为python,照抄自解密代码,这里主要用了两个IDC函数:

long Word(long addr) : 从虚拟机地址addr处读取一个字(2字节)值
void PatchWord(long addr, long val) : 设置虚拟地址addr处的一个字值

pic2.png

保存运行后,发现反汇编窗口0x100b6后的内容已经更新,变得可读。
pic3.png
继续分析程序,发现还有一处自解密,这回用的时base64解密,还好python就有base64模块,不用自己实现非常方便,如下:
pic4.png
运行解密后,程序主要逻辑出来了,分析后发现是对输入字符进行base64加密,之后做些反转交换等操作。再跟密文比较是否一样。我们可以继续使用idapython写出逆过程得到flag。
pic5.png
还有一点注意的是,如果使用idapython修改了数据,是没有撤销功能的,因此可以在修改前保留个快照,按 ctrl+shift+T 弹出数据库快照管理界面,之后保存快照。如果发现修改错了数据,可以恢复快照。