基础工具的使用
IDA pro(交互式反编译器专业版)是二进制安全研究人员必备的反汇编、反编译工具,功能繁多而强大,反编译结果清晰明了。
IDA pro 是收费软件,价格极其昂贵,一套完全版人民币 10W 左右,因此可以到各大网站下载破解版,注意到一些知名网站下载,比如吾爱破解等,防止下载的软件包含病毒。在编写此文时,IDA pro 更新到了 8.3,网上能找到的最新的版本为 7.7。本文由于版权原因,不提供下载链接。
简易使用方法
本文档仅作快速入门,更加细节的内容还请读者查阅其他资料以及多加实践。
另外在任何使用上操作的问题,都可以在群里提问!
0x00 IDA 简单介绍
IDA 是一款交互式反汇编和反编译工具,其支持文件类型和文件平台丰富。
可静态分析也可动态调试,可以说是二进制手的吃饭工具了
0x01 启动界面
NEW:打开 IDA 同时弹出对话框选择要打开的文件
Go:单独打开 ida,打开界面将文件拖入
Previous,或者下面的列表项:快速打开之前的的文件
2
3
这里选择 Go 键,打开以后,将文件拖入
这里按我们的默认选项点击 OK 即可
0x02 关闭界面
TIP
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
第二个选项及图中选项:就是把这几个数据库文件打包为 1 个 (如.i64 文件),下次打开我们分析的文件的时候,打开这个文件即可。
第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。
下面两个选项 第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存
最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)
0x03 主界面 - IDA View&Pseudocode
反汇编代码的图表窗口
按空格键切换成文本结构的反汇编
按 F5 进行反编译跳转至 Pseudocode
(伪代码) 界面
然后就可以分析代码逻辑了
直接点击函数名可以进入到对应函数内部查看函数逻辑
0x04 主界面 - Hex View
十六进制窗口 (不太常用)
0x05 主界面 - Structures
结构体窗口
0x06 主界面 - Enums
枚举类型界面
0x07 主界面 - Imports
导入表
可以查看当前模块用了哪些模块的哪些函数
0x08 主界面 - Exports
导出表
0x09 主界面 - Strings
按 Shift+F12
转到 String
界面,该操作会搜索程序中的字符串数据并展示
按 Ctrl+F
后输入想要检索的字符可以快速搜索字符串
0x0a 其他界面 - Functions
罗列了程序中用到的所有函数,包括底层调用的库的函数
其中一般来说 main
是程序的主要函数
0x0b 其他界面 - Output
程序的输出信息都会展示在这里
其中包括插件的加载信息、插件 / 脚本运行时的输出等
另外还可以直接在下面输入 python 语句,方便在 ida 使用过程中简单的数据处理
0x0c 其他界面 - 导航栏
一个二进制文件包括不同的区块,这里显示程序的不同类型数据,不同的颜色代表二进制文件中不同的块
0x0d 常用快捷键
边用边记,多打打就会记住了!
只记录了部分
;
为当前指令添加注释/
在伪代码中添加注释g
跳转到任意地址Esc
返回到跳转前的位置n
定义或修改名称,常用来修改函数和变量的名字A
按照 ASCII 显示数据D
分别按字节、字、双字来显示数据F5
反编译汇编代码,得到 C 伪代码Shift+F12
搜索程序中的字符串Alt+t
搜索程序中的指令Ctrl+x
查看变量和函数的引用Y
修改变量 / 函数类型F2
快速下断点
0x0e 常用插件
具体安装和使用不在此展开了
- Find Crypt -- 寻找常用加密算法中的常数(需要安装 yara-python)
- Keypatch -- 基于 Keystone 的 Patch 二进制文件插件
- LazyIDA: Make your IDA Lazy! -- 快速 Dump 内存数据
- Finger -- 函数签名识别插件
- D810 -- 去混淆插件
0x10 IDA Python
IDA 提供可与其交互的 IDA Python 接口,可以使用 Python 做很多的辅助操作
可以参考这篇文章了解常用的接口
IDA Python 常用函数 | 4nsw3r's Blog
0x11 IDA 动态调试
暂时只对 Windows 和 Linux 下的文件调试做介绍,Mac 和 Android 下的文件调试有待读者后续探索
调试 Windows 下的文件
可以先在汇编代码或伪代码界面下断点,然后 F9
选择调试器,这里直接选 Local Windows Debugger
之后就可以用 F7 (单步不跳过执行)/F8 (单步跳过执行)/F9 (继续执行,遇到断点停止) 进行调试
调试 Linux 下的文件
可以先在汇编代码或伪代码界面下断点
由于 Linux 下文件调试比较特殊,需要远程起一个服务器运行服务端,这里可以使用 Vmware 或者 **WSL2 (Windows subsystem Linux)** 进行调试
因篇幅有限,在这里直接贴篇链接供大家学习并选择调试方式
- Vmware 调试 IDA 动态调试 ELF
- WSL 调试(安装好 WSL 直接运行 ida dbgsrv 目录下 linux_server 文件即可以)
后面是一样的调试步骤
0x12 一个简单程序的分析
源代码
#include <stdio.h>
#include <string.h>
void change(char* str) {
for (int i = 0; i < strlen(str) ; i++) {
str[i] = str[i] - 1;
}
}
int check(char* str){
return strcmp(str, "ek`fzHC@^0r^m/s^b/lo0dw2c|") == 0;
}
int main() {
char input[100];
scanf("%100s", input);
change(input);
if (check(input)) {
printf("You are right\n");
}
else {
printf("You are wrong\n");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
分析历程
将程序拖入 IDA
F5 分析查看伪代码
发现有 change
和 check
的自定义函数
按 n
修改一下变量名
分别进入里面查看函数逻辑
查看函数逻辑
change 函数
check 函数
静态分析逻辑
change 函数是对输入字符串的每一个字节进行修改
然后在 check 函数进行比较
动态分析逻辑
在 change 函数进入前下好断点
随意的进行一些输入
然后断下来
F7 进入函数进行单步不跳过调试
遇到类似 strlen
等库函数可以 F8 单步调试跳过
可以发现输入字符串的每一个字节的 Ascii 值都减小了 1
脚本编写
试试写一个脚本解出这道题吧!