Files
fzu-product/6.计算机安全/6.2.1基础工具的使用.md
2023-07-19 20:23:54 +08:00

303 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 基础工具的使用
IDA pro (交互式反编译器专业版)是二进制安全研究人员必备的反汇编、反编译工具,功能繁多而强大,反编译结果清晰明了。
IDA pro 是收费软件,价格极其昂贵,一套完全版人民币 10W 左右因此可以到各大网站下载破解版注意到一些知名网站下载比如吾爱破解等防止下载的软件包含病毒。在编写此文时IDA pro 更新到了 8.3,网上能找到的最新的版本为 7.7。本文由于版权原因,不提供下载链接。
# 简易使用方法
> 本文档仅作快速入门,更加细节的内容还请读者查阅其他资料以及多加实践。
>
> 另外在任何使用上操作的问题,都可以在群里提问!
## 0x00 IDA 简单介绍
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809113855166.png)
IDA是一款交互式反汇编和反编译工具其支持文件类型和文件平台丰富。
可静态分析也可动态调试,可以说是二进制手的吃饭工具了
## 0x01 启动界面
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809114834244.png)
```
NEW打开IDA同时弹出对话框选择要打开的文件
Go单独打开ida打开界面将文件拖入
Previous或者下面的列表项快速打开之前的的文件
```
这里选择Go键打开以后将文件拖入
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809124156697.png)
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809124408179.png)
这里按我们的默认选项点击OK即可
## 0x02 关闭界面
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809125554853.png)
```
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
第二个选项及图中选项就是把这几个数据库文件打包为1个(如.i64文件),下次打开我们分析的文件的时候,打开这个文件即可。
第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。
下面两个选项
第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存
最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)
```
## 0x03 主界面- IDA View&Pseudocode
反汇编代码的图表窗口
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809130857159.png)
按**空格键**切换成文本结构的反汇编
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809130940294.png)
按**F5**进行反编译跳转至`Pseudocode`(伪代码)界面
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809131038284.png)
然后就可以分析代码逻辑了
直接点击函数名可以进入到对应函数内部查看函数逻辑
## 0x04 主界面- Hex View
十六进制窗口(不太常用)
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809132027773.png)
## 0x05 主界面-Structures
结构体窗口
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809132130778.png)
## 0x06 主界面-Enums
枚举类型界面
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809132242739.png)
## 0x07 主界面-Imports
导入表
可以查看当前模块用了哪些模块的哪些函数
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809132327043.png)
## 0x08 主界面-Exports
导出表
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809151050575.png)
## 0x09 主界面-Strings
`Shift+F12`转到`String`界面,该操作会搜索程序中的字符串数据并展示
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809153126737.png)
`Ctrl+F`后输入想要检索的字符可以快速搜索字符串
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809153408536.png)
## 0x0a 其他界面-Functions
罗列了程序中用到的所有函数,包括底层调用的库的函数
其中一般来说`main`是程序的主要函数
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809151328885.png)
## 0x0b 其他界面-Output
程序的输出信息都会展示在这里
其中包括插件的加载信息、插件/脚本运行时的输出等
另外还可以直接在下面输入python语句方便在ida使用过程中简单的数据处理
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809151536894.png)
## 0x0c 其他界面-导航栏
一个二进制文件包括不同的区块,这里显示程序的不同类型数据,不同的颜色代表二进制文件中不同的块
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809151815243.png)
## 0x0d 常用快捷键
> 边用边记,多打打就会记住了!
>
> 只记录了部分
- `;` 为当前指令添加注释
- `/` 在伪代码中添加注释
- `g` 跳转到任意地址
- `Esc` 返回到跳转前的位置
- `n` 定义或修改名称,常用来修改函数和变量的名字
- `A` 按照ASCII显示数据
- `D` 分别按字节、字、双字来显示数据
- `F5`反编译汇编代码得到C伪代码
- `Shift+F12` 搜索程序中的字符串
- `Alt+t` 搜索程序中的指令
- `Ctrl+x` 查看变量和函数的引用
- `Y` 修改变量/函数类型
- `F2`快速下断点
## 0x0e 常用插件
> 具体安装和使用不在此展开了
- [Find Crypt](https://github.com/polymorf/findcrypt-yara) -- 寻找常用加密算法中的常数(需要安装 [yara-python](https://github.com/VirusTotal/yara-python)
- [Keypatch](https://github.com/keystone-engine/keypatch) -- 基于 Keystone 的 Patch 二进制文件插件
- [LazyIDA: Make your IDA Lazy! ](https://github.com/P4nda0s/LazyIDA) -- 快速Dump内存数据
- [Finger](https://github.com/aliyunav/Finger) -- 函数签名识别插件
- [D810](https://gitlab.com/eshard/d810) -- 去混淆插件
## 0x10 IDA Python
IDA 提供可与其交互的IDA Python接口可以使用Python做很多的辅助操作
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809154742462.png)
可以参考这篇文章了解常用的接口
[IDA Python 常用函数 | 4nsw3r's Blog](https://4nsw3r.top/2022/02/11/IDA Python 常用函数/)
## 0x11 IDA 动态调试
> 暂时只对Windows和Linux下的文件调试做介绍Mac和Android下的文件调试有待读者后续探索
### 调试Windows下的文件
可以先在汇编代码或伪代码界面下断点,然后`F9`选择调试器,这里直接选`Local Windows Debugger`
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809160044665.png)
之后就可以用F7(单步不跳过执行)/F8(单步跳过执行)/F9(继续执行,遇到断点停止)进行调试
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809163138453.png)
### 调试Linux下的文件
可以先在汇编代码或伪代码界面下断点
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809155352920.png)
由于Linux下文件调试比较特殊需要远程起一个服务器运行服务端这里可以使用**Vmware**或者**WSL2(Windows subsystem Linux)**进行调试
因篇幅有限,在这里直接贴篇链接供大家学习并选择调试方式
- Vmware 调试 [IDA动态调试ELF](https://bbs.pediy.com/thread-247830.htm)
- WSL 调试 安装好WSL直接运行ida dbgsrv目录下linux_server文件即可以
后面是一样的调试步骤
## 0x12 一个简单程序的分析
#### 源代码
```c
#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");
}
}
```
#### 分析历程
##### 将程序拖入IDA
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809173439491.png)
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809173548998.png)
##### F5分析查看伪代码
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809173627488.png)
发现有`change``check`的自定义函数
`n`修改一下变量名
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809174001600.png)
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809174015603.png)
分别进入里面查看函数逻辑
##### 查看函数逻辑
change函数
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809174035800.png)
check函数
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809174058831.png)
###### 静态分析逻辑
change函数是对输入字符串的每一个字节进行修改
然后在check函数进行比较
###### 动态分析逻辑
在change函数进入前下好断点
随意的进行一些输入
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809174913326.png)
然后断下来
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809174957987.png)
F7进入函数进行单步不跳过调试
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809175413448.png)
遇到类似`strlen`等库函数可以F8单步调试跳过
![](https://blog-t0hka.oss-cn-hangzhou.aliyuncs.com/img/image-20220809175459668.png)
可以发现输入字符串的每一个字节的Ascii值都减小了1
##### 脚本编写
试试写一个脚本解出这道题吧!