OD: Peimei & Versioning Analysis
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 下载以下软件/组件
Paimei 1.2:https://github.com/OpenRCE/paimei
Paimei 组件 pydbg:https://github.com/OpenRCE/paimei
Python 2.6.:该版本已包含 ctypes
MariaDB:用来代替 MySQL,MySQL 多兆,安装 MySQL 5.6 还需要 .NET 4.0 支持,麻烦且臃肿。
pyparsing
pydot:依赖于 pyparsing
wxPython3.-win32-3.0.1.1-py26.exe
MySQL-python-1.2..win32-py2..exe
GraphViz
gde-win.exe:GoVisual Diagram Editor
uDrawGraph-3.1.--win32-en.exe
IDA:看雪 大礼包中的 IDA Pro 5.5 就行,省事
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 Files\GraphViz)、gde、uDraw(Graph)
4 安装 pyparsing、pydot、wxPython
5 修改 paimei1.2\__build_installer.bat 中的 python 执行路径,然后运行 __build_installer.bat
6 安装 paimei1.2\dist\PaiMei-1.2.win32.exe
7 运行 paimei1.2\__setup_mysql.py <mysql_host> <username> <password>
8 安装 IDA,修改 IDA\plugins 目录下的 python.disable 为 python.plw,接着为 IDA 添加 IDAPython 插件(用插件中 plugins 和 python 两个目录来同步)。
运行 Paimei
1 运行 uDraw:"C:\Program Files\uDraw(Graph)\bin\uDrawGraph.exe" -server 2542
2 运行 paimei1.2\console\PAIMEIconsole.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 就可以查看具体差异信息。
通过补丁文件挖掘漏洞信息需要扎实的逆向功底,微软的一个补丁包往往会修改很多地方,要想迅速找到能够利用的漏洞,娴熟的技巧和丰富的经验都必不可少!
OD: Peimei & Versioning Analysis的更多相关文章
- Technical analysis of client identification mechanisms
http://www.chromium.org/Home/chromium-security/client-identification-mechanisms Chromium > Chro ...
- TRAFFIC ANALYSIS EXERCISE - Ransomer
catalogue . SCENARIO . QUESTIONS . Analysis:10.3.14.134 . Analysis:10.3.14.131 1. SCENARIO The pcap ...
- scRNA-seq genomic analysis pipline
a scRNA-seq genomic anlysis pipline .caret,.dropup>.btn>.caret{border-top-color:#000!important ...
- Deep-learning augmented RNA-seq analysis of transcript splicing | 用深度学习预测可变剪切
可变剪切的预测已经很流行了,目前主要有两个流派: 用DNA序列以及variant来预测可变剪切:GeneSplicer.MaxEntScan.dbscSNV.S-CAP.MMSplice.clinVa ...
- Linux之od命令详解
功能说明:输出文件内容.语 法:od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数&g ...
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ...
- Why many EEG researchers choose only midline electrodes for data analysis EEG分析为何多用中轴线电极
Source: Research gate Stafford Michahial EEG is a very low frequency.. and literature will give us t ...
- od 查看特殊格式的文件内容
用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件. 语法: od [选项] 文件- 命令中各选项的含义: - A 指定地址基数 ...
- Automated Memory Analysis
catalogue . 静态分析.动态分析.内存镜像分析对比 . Memory Analysis Approach . volatility: An advanced memory forensics ...
随机推荐
- 【转】C#正则表达式详解
正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde&qu ...
- hadoop输出统计
- hadoop 异常 INFO ipc.Client: Retrying connect to server:
// :: INFO ipc.Client: Retrying connect to server: master/. Already tried , sleepTime= SECONDS) // : ...
- BZOJ 1052 覆盖问题
Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...
- 【技术贴】第二篇 :解决使用maven jetty启动后无法加载修改过后的静态资源
之前写过第一篇:[技术贴]解决使用maven jetty启动后无法加载修改过后的静态资源 一直用着挺舒服的,直到今天,出现了又不能修改静态js,jsp等资源的现象.很是苦闷. 经过调错处理之后,发现是 ...
- Network Saboteur
poj2531:http://poj.org/problem?id=2531 题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大.题解:一开始比知道怎么办,想用 ...
- 查看Ubuntu操作系统位数
查看系统是32位还是64位 #查看long的位数,返回32或64 getconf LONG_BIT
- java中的string字符串中的trim函数的作用
去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...
- Android Wear开发 - 数据通讯 - 第一节 : 连接数据层
http://developer.android.com/training/wearables/data-layer/accessing.html Accessing the Wearable Dat ...
- sphinx插入css
使用role指令达到目的. We can put following lines at the beginning of our RST file to specify its style. .. r ...