PE 中漫步—“白眉”
指令追踪技术与 Paimei
程序异常发生的位置通常离漏洞函数很远,当溢出发生时,栈帧往往也会遭到破坏,给动态调试制造很大的困难。
指令追踪最大限度地结合了动态分析和静态分析的做点,能够迅速定位漏洞。其工作流程如下:
1 将目标 PE 文件反汇编,按照指令块记录下来(通常用跳转指令来划分)
2 用调试器加载 PE 文件,或者 Attach 到目标进程上,并对程序进行一定操作
3 指令追踪工具会在最初记录的静态指令快中标注当前操作所执行过的指令,用户在阅读反汇编代码的同时也能获得程序执行流程信息
最早的指令追踪软件是 Sabre 公司出品的 BinNavi,它工作在 IDA 反汇编的结果之上,能够用图形标注出代码块之间的调用关系,迅速定位程序中某种操作对应的代码。但 BinNavi 是商业软件,连 evaluation version 都没提供。别一款优秀且免费的软件是逆向界的 MetaSploit:Paimei,所说其作者 Pedram Amini 非常崇拜 Kill Bill II 中的中国白眉大侠,所以得名 Paimei。
Paimei 使用 Python 语言开发,模块化和扩展性良好,包含 explore、filefuzz、pstaker 三个模块。其中 pstaker 是用来进行指令追踪的。Pedram Amini 在逆向峰会 RECON2006 上提到后续会加入补丁比较、网络 Fuzz 等模块。
安装 Paimei1.2
Paimei 已经停止更新很久了,其 1.2 版本在 github 托管,安装过程不友好,所以记录如下。
1 下载以下软件/组件
1 Paimei 1.2:https://github.com/OpenRCE/paimei 2 Paimei 组件 pydbg:https://github.com/OpenRCE/paimei 3 Python 2.6.6:该版本已包含 ctypes 4 MariaDB:用来代替 MySQL,MySQL 500 多兆,安装 MySQL 5.6 还需要 .NET 4.0 支持,麻烦且臃肿。 5 pyparsing 6 pydot:依赖于 pyparsing 7 wxPython3.0-win32-3.0.1.1-py26.exe 8 MySQL-python-1.2.2.win32-py2.6.exe 9 GraphViz 10 gde-win.exe:GoVisual Diagram Editor 11 uDrawGraph-3.1.1-0-win32-en.exe 12 IDA:看雪 2010 大礼包中的 IDA Pro 5.5 就行,省事 13 IDAPython for python26:http://bbs.pediy.com/attachment.php?attachmentid=39624&d=1267185909
2 解压 paimei,并将下载的 pydbg 包的内容解压到 paimei/pydbg 中
3 安装 Python 2.6.6、MariaDB、MySQL-python、GraphViz(安装路径为 C:Program FilesGraphViz)、gde、uDraw(Graph)
4 安装 pyparsing、pydot、wxPython
5 修改 paimei1.2\__build_installer.bat 中的 python 执行路径,然后运行 __build_installer.bat
6 安装 paimei1.2distPaiMei-1.2.win32.exe
7 运行 paimei1.2\__setup_mysql.py <mysql_host> <username> <password>
8 安装 IDA,修改 IDAplugins 目录下的 python.disable 为 python.plw,接着为 IDA 添加 IDAPython 插件(用插件中 plugins 和 python 两个目录来同步)。
运行 Paimei
1 运行 uDraw:"C:Program FilesuDraw(Graph)inuDrawGraph.exe" -server 2542
2 运行 paimei1.2consolePAIMEIconsole.pyw
使用 Paimei 的指令追踪模块 pstalker
一、以 calc.exe 为例,首先使用 IDA 对 calc.exe 进行反汇编,之后使用 IDAPython 插件(Alt+9 或者 Edit - Plugins - IDApython)启动 Paimei 目录下的 pida_dump.py 脚本,将 IDA 的分析结果保存为 Paimei 所使用的 pida 数据文件。
二、启动 MySQL 或者 MariaDB,以及服务器模式的 uDraw,因为 Paimei 使用 MySQL 存储静态分析结果、用 uDraw 绘图。之后启动 Paimei 的 console,在 Connections 菜单下连接 MySQL 和 uDraw。
三、在 Paimei 左侧单击 PAIMEI pstalker,进入指令追踪模块。
四、单击 Paimei 界面中的 PIDA 面板上的 Add Module(s) 按钮,将 IDA 导出的 .pida 文件导入 Paimei。
五、右键单击 Avaliable Targets,选择 Add targets,新建一个追踪目标并命名为 calc。
六、右键单击添加的追踪目标,选择 Add Tag,添加并命名为 test1。Tag 用于区别一次指令追踪操作,可以在一个追踪目标下建立多个 Tag 以标识不同的追踪操作。
七、右键单击新添加的 Tag,选择 Use for Stalking,此时对应的 Tag 图标上会出现放大镜表示操作成功。
八、之后有两种方式加载进程并追踪:单击 Browse 按钮加载,或者单击 Refresh Process List 按钮来 Attach 进程。设定好后单击 Start Stalking 按钮开始追踪。
九、追踪结束后(进程关闭或单击 Stop Stalking 按钮结束追踪),右键单击当前的 Tag,选择 load hits,就可以将执行到的指令块从数据库中读入并显示出山详细信息;如果选择 Sync with uDraw,Paimei 会在 uDraw 界面内绘制出执行过的指令块及其之间的调用关系。依次选中读入 Paimei 的指令块,Paimei 面板中会将对应的寄存器状态等详细信息显示出来,uDraw 中会自动将图形移动到这个指令块并用蓝色标记出来,方便在观看静态代码的同时了解程序动态执行流程(使用双屏显示更便于观察)。
迅速定位特定功能对应的代码位置
如果不关心程序启动和初始化过程,可以在指令追踪的过程中用之前追踪过的结果进行过滤,只追踪出期望的功能所对应的代码,达到化繁为简的效果。
例如,只想知道 calc.exe 中单击清零键 C 时程序所执行的代码,可以使用如下方法:
一、先建立一个 Tag,命名为 init,并用来追踪 calc.exe 的启动过程。uDraw 显示其全局调用图较复杂,见下图。
二、新建一个 Tag,命名为 press_c,用来追踪按下清零键 C 时 calc.exe 所执行的代码。
三、press_c 设定好后,在 init Tag 上右键,选择 Filter tag,这时 init Tag 的图标会变成一把剪刀,表示对 init 中追踪到的代码进行过滤;然后对 press_c Tag 启动追踪。
四、在出现的 calc.exe 面板上单击 C,这时 press_c 中会过滤 init 中的启动模块,仅记录按下 C 后的模块(仅记录了 6 个模块)。
通过这种方法能迅速定位特定功能的操作所对应的代码,从而集中精力有重点地进行逆向分析。分析漏洞时,可以先在程序正常执行时进行指令追踪,然后用正常执行的追踪作为 filter,再去追踪漏洞被触发时的执行流程,就能迅速地定位漏洞代码的位置!
虽然 Paime 能够极大地提高逆向分析的效率,但也有不足:其指令追踪依赖于 IDA,其分析结果也依赖于 IDA 分析的正确性,但 IDA 在一些情况下会出错(如加壳 PE),这会影响 Paimei 的分析结果,甚至导致 crash。
补丁比较
补丁比较工具中比较出色的还是 Sabre 公司的 bindiff,其主页地址为:http://www.zynamics.com/bindiff.html
另一个功能相近的免费软件是 Eeye 公司的 DiffingSuite,DiffingSuite 包含两个工具:BinaryDiffing Stater 和 Darun Grim。其中,Darun Grim 是结合了图形绘制的高级补丁比较器。
Darun Grim 使用 IDA 作为反汇编器,安装后会在 IDA 中加入插件 AnalIDA,用于导出 IDA 的反汇编结果。
用 IDA 反汇编打补丁前的文件,自动分析结束后从 Edit - Plugins - AnalIDA 导出分析结果到 filename.db。之后再用 IDA 对打补丁之后的文件进行反汇编,同样地将结果导入到之前的 filename.db。启动 Darun Grim 并新建一次 diff 操作,选择 filename.db,并设定好补丁之前的文件名、之后的文件名以及输出目录,点击开始分析。
分析结束后可以按相似度 Match Rate 排序,选择相似度小于 1 的函数,并点击 Diff 就可以查看具体差异信息。
通过补丁文件挖掘漏洞信息需要扎实的逆向功底,微软的一个补丁包往往会修改很多地方,要想迅速找到能够利用的漏洞,娴熟的技巧和丰富的经验都必不可少!