网络攻防小学期(四)逆向工程与二进制漏洞

逆向工程指通过反汇编、反编译来阅读源代码,分析软件的数据结构等。找出漏洞。

第一章 基础知识

内存布局

从内存低地址到内存高地址依次是

  • 保留区
  • 代码区
  • 已初始化数据区
  • 未初始化数据区
  • 堆区
  • 栈区
  • 内核区

通用寄存器

寄存器是 CPU 中的高速存贮组件,可以用于暂存指令、数据和地址。在 16 位 CPU 中, 有 8 个 16 位的通用寄存器,其中有 4 个数据寄存器 AX、BX、CX 和 DX,2 个指针寄存器 SP 和 BP,还有 2 个变址寄存器 SI 和 DI。在 32 位 CPU 中,有 8 个 32 位的通用寄存器,分别与 16 位 CPU 的寄存器相对应,称为 EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI。在 64 位 CPU 中,除了 8 个相对应的 64 位通用寄存器 RAX、RBX、RCX、RDX、RSP、RBP、RSI、 RDI 外,还增加了 R8、R9、R10、R11、R12、R13、R14 和 R15 这 8 个通用寄存器。ARM 处 理器有 7 种不同的工作模式,这些工作模式共享 32 位的 R0、R1、R2、R3、R4、R5、R6、R7、 这 8 个通用寄存器,另外的 32 位通用寄存器 R8、R9、R10、R11、R12、R13、R14 情况比较 复杂,有些工作模式共享某些寄存器,有些工作模式有自己的一组寄存器。也就是说,虽然名 称都是 R8-R14,但实际上有不止 7 个寄存器。ARM 中的 R15 寄存器用作程序计数器。

从寄存器名称可以看出,数据寄存器 AX、EAX、RAX 是同一命名系列的寄存器,实际上 多位的寄存器也支持直接访问低位寄存器对应的部分。

以RAX举例,RAX为64位寄存器,EAX为32位寄存器(RAX的低32位),AX为16位寄存器(EAX的低16位),AH、AL为8位寄存器,其中AH为AX的高8位,AL为AX的低8位。

函数调用

调用函数的时候,先压入实际参数,对C语言来说默认从右往左压栈。然后将当前EIP(即函数的返回地址)压栈,并且将EIP设为调用函数的起始地址。

进入调用函数之后,压入当前的EBP指针,然后将EBP设为ESP。

第二章 分析工具

  • IDA pro
  • gdb

花指令与壳

静态分析工具直接基于二进制的机器指令进行反汇编,如果精心设计一段汇编指令,可以 让静态分析工具犯错误,这样的指令称为花指令。

一种简单的花指令设计方法是在某段程序的正常入口地址前留出一段空间,空间的第一句 指令是跳转指令,跳转到正常入口地址,这样程序在执行时与没有花指令前的效果一样。跳转 指令后的内容在运行时并不会执行到,所以是无效的,但静态分析工具会试图将这些内容也进 行反汇编。如果填写一些内容,使空间末尾处的无效数据与正常入口地址处指令的部分二进制 数据刚好能够拼接起来,被解释成某条指令,就能够影响后续正常指令的反汇编,造成整个程 序的反汇编错误或失败,无法进行静态分析。

还有一种保护程序不被反编译或非法修改的方法是加壳。壳其实是一段程序,它先于实际的程序被执行。实际程序在加壳时,经过某种处理变得无法直接执行,而壳运行起来后,在内 存中通过逆操作,使得处理后的实际程序恢复正常状态,再继续执行。对实际程序的处理通常 是压缩和加密,压缩的主要目的是减小程序的大小,附带起到加密作用。软件加壳的同时,还 能够附带实现软件注册、限制使用时间和次数等功能。

加壳是一种软件加密的手段,如果知道了加壳的方法,就可以生成有针对性的脱壳工具。

第三章 缓冲区溢出漏洞

漏洞特指软件中影响安全性的缺陷(bug),发现二进制漏洞是网络安全领域逆向工程的 主要目的。最常见的二进制漏洞是缓冲区溢出漏洞。缓冲区溢出漏洞在操作系统和各类应用软 件中普遍存在,针对缓冲区溢出漏洞的攻击轻则使程序运行崩溃、系统死机,重则使攻击者获 得系统控制权,进而进行各种非法操作和破坏。