本书第三章是动态分析的入门,对进行动态分析最基本的工具和方法进行了简述。
第四章 x86反汇编速成班
1. 内存
有四个重要的节
- 数据:静态值,在程序初始加载时被放在这里,在程序运行时他们可能并不发生变化,也称全局值。
- 代码:包含在执行程序任务时CPU所取得的指令,这些代码决定了程序做什么以及程序中任务如何协调工作。
- 堆:为程序执行期间需要的动态内存准备的,用于创建(分配)/消除值。
- 栈:用于函数的局部变量和参数,以及控制执行流。
2. 寄存器
(1)通用寄存器
- 数据寄存器
- AX (Accumulator):累加寄存器
- BX (Base):基地址寄存器
- CX (Count):计数器寄存器
- DX (Data):数据寄存器
- 指针寄存器
- SP (Stack Pointer):堆栈指针寄存器
- BP (Base Pointer):基指针寄存器
- 变址寄存器
- SI (Source Index):源变址寄存器
- DI (Destination Index):目的变址寄存器
(2)段寄存器
- CS (Code Segment):代码段寄存器
- DS (Data Segment):数据段寄存器
- SS (Stack Segment):堆栈段寄存器
- ES (Extra Segment):附加段寄存器
(3)控制寄存器
- EIP指针:保存了程序要执行的下一条指令在内存中的地址,唯一作用就是告诉处理器接下来到那里去读取指令。
- 当eip被破坏,指向了一个不包含合法程序代码的内存地址时,CPU无法取得一条合法指令来执行,即控制了eip就控制流CPU要执行什么。
- 通常攻击者先要使攻击代码进入内存,然后改变eip使其指向攻击代码,从而实现目的。
3. 汇编指令与C语言主函数和偏移
- 反汇编器可以将操作码翻译成指令,阅读时需要注意是Big-Endian还是Little-Endian。
- 相关内容在之前的课程中学过,不再赘述。参见:信息安全系统设计基础第四周学习总结
第五章 IDA Pro
1. 加载程序
- 一般:以x86架构、PE格式文件加载。
- 特殊:将文件作为一个原始二进制文件进行反汇编。有些恶意代码带有shellcode、其它数据、加密参数,甚至在合法的PE文件中带有可执行文件,并且当包含这些附加数据的恶意代码在Windows上加载到IDA中时,它并不会被加载到内存中。
- PE文件被编译加载到内存中一个首选的地址,若无法加载,加载器执行一个基地址重定向的操作。
- 在默认情况下,IDA的反汇编代码中不包含PE头或资源节。
2. 常用窗口
(1)反汇编窗口
两种模式:图形模式、文本模式。
转换:空格键
- 图形模式
- 箭头颜色
- 红色:条件跳转没有被采用
- 绿色:条件跳转被采用
- 蓝色:无条件跳转被采用
- 箭头方向
- 显示程序流程
- 向上的箭头表示一个循环条件
- 箭头颜色
- 文本模式
- 显示内存地址和节名
- 左侧显示箭头窗口:显示程序的非线性流程
- 实线:无条件跳转
- 虚线:标记条件跳转
- 向上箭头:表示一个循环
(2)默认视图
IDA Pro功能丰富,以至于在一些操作之后会无法浏览,需要返回默认视图。
- 返回默认视图:Windows->Reset Desktop
- 保存修改后窗口视图:Windows->Save Desktop
(3)导航
- 使用反汇编窗口内的链接,可以显示目标的位置。
- 常见链接类型:
- 子链接:函数开始的链接
- 本地链接:跳转指令目的地址的链接
- 偏移链接:内存偏移的链接
- 浏览历史可以切换跳转视图。
- 导航栏:用颜色表示被加载到二进制地址空间的线性视图
- 浅蓝色:被FLIRT识别的库代码
- 红色:编译器生成的代码
- 深蓝色:用户编写的代码
- 跳转位置
- 跳转到任意虚拟内存地址:快捷键G
- 跳转到原始的文件偏移:Jump->Jump to File Offset
(4)搜索
- Search->Next Code:移动光标到包含你所指定的指令的下一位置。
- Search->Text:在整个反汇编窗口中搜索一个指定的字符串。
- Search->Sequence of Bytes:在十六进制视图窗口中对一个特定字节序执行二进制搜索。
3. 交叉引用
在IDA中,Xrefs可以展示出一个函数在何处被调用,或者一个字符串被使用。
- 代码交叉引用:在函数上使用快捷键X,打开函数被调用位置,双击转到反汇编窗口中对应的代码。
- 数据交叉引用:用于跟踪一个二进制文件中的数据访问。在注释中,会显示DATA XREF,告诉数据交叉引用的位置。
4. 分析函数
IDA Pro最强大的功能就是识别函数、标记函数,并且划分出局部变量和参数。
- 局部变量:以var_作为前缀标记,在相对EBP负偏移量的位置。
- 参数:以arg_作为前缀标记,在相对EBP正偏移量的位置。
- 将局部变量和参数用相对EBP的偏移量作为后缀来进行命名。
5. 图形化选项
- Function calls:显示所有的函数调用
- Xrefs to:查看哪些函数调用了这个函数
- Xrefs from:查看这个函数调用了那些函数
- User Xrefs chart:可以让用户选择显示内容
6. 增强反汇编
这一部分的目的就是让反汇编代码阅读性更强,使我们更能更好的分析程序。
- 可以通过修改IDA中的反汇编方便分析一个二进制文件。注意,IDA没有撤销功能,修改需慎重。
- 重命名位置:根据实际功能取代系统自动的命名
- 使用命名的常量:Use Standard Symbolic Constant打开标准符号常量窗口,可以选择相关的常量来使代码更有意义。
7. 用插件扩展IDA
- 扩展IDA功能,加快分析速度