本书第三章是动态分析的入门,对进行动态分析最基本的工具和方法进行了简述。

第四章 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语言主函数和偏移


第五章 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功能,加快分析速度

8. 实践