IDA 分析技巧记录

0x10 恢复结构体

恢复结构体对我们的分析很有帮助

下面用一道例题介绍IDA如何恢复结构体来帮助分析

题目是pwnable.tw上的一道堆题,hacknote

image-20210718125858815

通过对程序的简单分析后我们得出程序的结构体大概是这个样子:

typedef struct node{
	char * print_ptr;
	char * content;
}hacknote;

而ida只能按偏移来识别,对我们的分析不是很有利

我们在结构体窗口新建一个结构体:

insert : i 新建结构体

image-20210718130324270

创建好以后是这个样子

image-20210718130409235

我们可以看到这里是没有结构体成员的,按D 新加入成员(注意:要在ends后面按)

加入成员后我们对成员设置名字,以及类型

image-20210718130632445

image-20210718145543246

找到变量引用位置alt+q,选择我们的结构体

image-20210718145748320

修改变量类型

image-20210718145851634

修改为note类型,并将变量重命名之后

image-20210718150122551

可以看到结构体已经被恢复成功

0x20 取出数组值

有时候逆向的时候我们需要取出数组里面的值,但一个个复杂又太麻烦

image-20210718150819490

我们可以直接shift + E 来提取

image-20210718151245865

0x30 还原静态库的符号信息

还原静态库的信息一般用的是 IDA 提供的 FLIRT,这是一种函数识别技术,即库文件快速识别与鉴定技术(Fast Library Identification and Recognition Technology)。可以通过 sig 文件来让 IDA 在无符号的二进制文件中识别函数特征,并且恢复函数名称等信息,大大增加了代码的可读性,加快分析速度。

而标准库的 sig 文件也有现成制作好的,在 https://github.com/push0ebp/sig-database 中下载,并且把文件导入到 IDA/sig/pc 中就能够使用

这里我们使用pwnhub内部赛的一道题来做案例:babyboa

ida打开题目我们可以发现,题目函数名被去除了

image-20210718151539998

导入后再在 IDA 中按 Shift + F5,打开“List of applied library modules”页面

image-20210718154000858

选择要导入的sig,可以看到识别出来了大部分函数

image-20210718154335601

image-20210718154443702

从官网上下载boa的源码,导入globals.h,并根据报错修改部分结构体

image-20210718154713634

image-20210718154908190

即可导入成功,手动重命名部分函数即可

0x40 findcrypt 插件

https://github.com.cnpmjs.org/polymorf/findcrypt-yara.git

0x50 IDA python

https://hex-rays.com/products/ida/support/idapython_docs/

0x60 diaphora

https://github.com.cnpmjs.org/HongThatCong/diaphora_py2.git
https://github.com.cnpmjs.org/joxeankoret/diaphora.git