《软件安全分析与应用》基础知识

从事恶意代码分析、软件漏洞分析的工作需要掌握计算机专业方面的诸多基础知识,这些知识包括但不限于硬件基础知识、反汇编及对抗技术以及操作系统基础。

处理器硬件架构基础

CPU结构

  1. CPU是计算机中央处理器的简称,控制着计算机的操作和执行数据处理功能,其结构包括寄存器、算术逻辑单元(ALU)、控制器和内部总线。
  2. CPU的4部分组成中,寄存器记录了操作系统关键数据结构的入口,这些信息是软件漏洞与恶意代码分析的基础信息,则这里重点关注CPU结构中的寄存器结构。
  3. IA-32的CPU寄存器包括指令指针寄存器、通用数据寄存器、地址指针寄存器、变址指针寄存器、标志位寄存器、段寄存器和控制寄存器等。
  4. 指令指针寄存器:EIP寄存器,存储了当前执行指令的地址。
  5. 通用数据寄存器:EAX、EBX、ECX、EDX,通常用于存储参与运算的数据及运算结果。其中ECX常被用于存储循环处理指令的循环次数,EAX和EDX常作为乘除法指令的隐含操作数。
  6. 地址指针寄存器:ESP、EBP。ESP记录了当前的栈顶,EBP记录的是当前函数的栈底。
  7. 变址指针寄存器:ESI、EDI,通常ESI是操作数源地址,EDI是操作数目的地址。
  8. 标志位寄存器:统称为EFLAGS。
标志位 含义
CF 进为标志
PF 奇偶标志
AF 辅助进位标志
ZF 零标志
SF 符号标志
TF 跟踪标志
IF 中断允许标志
DF 方向标志
OF 溢出标志
IOPL I/O特权标志
NT 嵌套任务标志
RF 恢复标志
VM 虚拟8086模式标志
AC 对齐检测标志
VIF 虚拟中断标志
VIP 虚拟中断等待标志
ID 识别标志
  1. 段寄存器:包括代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES、FS、GS。实模式下段寄存器通常与指针寄存器如ESP、EDI、ESI等联合使用,保护模式下需要与描述符表结合。
  2. 控制寄存器:包括CR0、CR1、CR2、CR3、CR4,用于记录处理器的运行模式和当前执行任务的属性。
控制寄存器 功能作用
CR0 记录系统控制标志,这些标志控制处理器的运行模式和状态。例如PE是保护模式标志,置1启用保护模式,置0启用实地址模式。
CR1 保留的控制寄存器,用于将来的扩展
CR2 记录引起页故障的线性地址
CR3 页表寄存器,存储了20位的页目录表的基地址和两个标志位PCD、PWT
CR4 包含一组标志,用于决定是否启用IA-32架构上的几个扩展。例如VME为虚拟8086模式扩展,置1表示在虚拟8086模式下启用中断和异常处理扩展,置0则关闭

保护模式

IA-32架构的CPU具有两种工作模式:实模式和保护模式,工作模式受到CR0控制寄存器的PE标志位控制。
实模式和保护模式:
CPU刚开始初始化后工作在实模式下,PE标志位值为0,仅使用20位地址,寻址空间为1MB。
当操作系统启动时,将CPU的PE标志位置1,开启保护模式,使用32位地址,内存寻址空间扩展到4GB。
实模式不支持多线程,不能实现权限分级;
保护模式下引入内存的分页和分段管理机制,实现了内存分页和权限分级,并支持多线程,多任务。分页由CR3寄存器支持,分段由内存管理寄存器(包括GDTR全局描述符表寄存器、IDTR中断描述符表寄存器、LDTR局部描述符表寄存器、TR任务寄存器)4个寄存器支持。

特权级

CPU支持Ring0、Ring1、Ring2、Ring3共4个权限级别,Ring0权限最高,Ring3权限最低,Windows操作系统只使用了Ring0和Ring3两个级别,其中,Ring0级可以访问Ring0和Ring3的资源,Ring3级无法访问Ring0级的资源,只能访问Ring3级的资源。
为了进行代码段和数据段间的特权级检验,需要3种类型的特权级支持:当前特权级CPL、描述符特权级DPL、请求特权级RPL。

中断处理与异常处理

  1. 中断和异常是程序执行过程中的插曲,需要处理器强制暂停当前任务,转移到一个称为中断处理程序或者异常处理程序的特殊任务中。
  2. 处理器响应中断或者异常所采取的行为称为服务或者处理中断和异常。
  3. IA-32架构为每一个异常和需要处理的中断分配了一个唯一识别码,称为中断向量。
  4. 引起中断产生的原因或来源,称为中段源,中断分为硬件中断(如键盘、鼠标)和软件中断(如INT n指令)。硬件中断属于外部中断。
  5. 引起异常产生的原因或来源称为异常源,包括处理器检测到程序错误异常、软件产生的中断和机器检测异常3种情况。

程序调试

程序调试时软件开发过程中进行排错和查错的过程,需要CPU架构的支持。
CPU设计了DR0-DR7共8个调试寄存器,用于断点设置功能。DR0-DR3这4个寄存器是断点地址寄存器,用于保存断点地址,DR4和DR5保留未使用,作为DR6和DR7的别名寄存器,DR6是调试状态寄存器,DR7是调试控制寄存器。

虚拟化支持

虚拟化技术能够基于系统CPU、内存、磁盘等资源虚拟出多台主机,提高资源利用率,最大化利用平台的硬件资源。

反汇编及对抗技术

在恶意代码与软件漏洞分析的过程中,软件逆向分析是一项基本的技能,这一技能包括反汇编及对抗技术。从汇编语言、反汇编方法与原理来介绍反汇编基础,介绍代码混淆、反调试的对抗技术。

汇编语言

汇编语言是一种用于计算机、微处理器、微控制器或其他可编程器件的低级语言,也称为符号语言。

  1. 寻址方式
    IA-32架构的微处理器支持的数据寻址方式包括寄存器寻址、立即寻址、直接寻址、寄存器间接寻址、基址变址寻址、寄存器相对寻址、相对基址加变址寻址、比例变址寻址。之前在CSAPP中复习过,这里不再展开。

  2. 常用的汇编指令
    汇编指令按照功能分类大致可分为数据传送指令、算术与逻辑运算指令、程序控制指令。
    指令格式:op num1 num2,其中op为操作码助记符,num1是第一个操作数,称为目的操作数,num2是第二个操作数,称为源操作数。
    (1)数据传送指令包括mov类指令、堆栈类指令、装载地址类指令、数据传送类指令、I/O传送类指令和其他传送指令。
    (2)算术与逻辑运算指令分为4类:加、减、乘、除指令,比较指令,与、或、非、异或逻辑运算指令以及移位运算指令。
    (3)程序控制指令包括转移指令、循环控制指令、过程调用指令、中断指令、机器控制指令等。

反汇编

反汇编是将机器语言转换成汇编语言的过程,将人类难以理解的机器语言转换成具有符号语义的指令语言。

  1. 基本的反汇编流程包括4个步骤:
    (1)确定反汇编的代码区域,即区分出程序的代码和数据段;
    (2)确定了程序代码入口后,读取该位置的二进制机器指令,执行表查找,将机器码的值与它对应的汇编语言助记符提取出来,然后根据指令状态机提取操作数。
    (3)获取指令并解码出所有的操作数之后,需要对它的汇编语言等价形式进行格式化,输出反汇编代码。
    (4)完成一条指令的反汇编后,重复上述过程,继续反汇编下一条指令,直到反汇编完程序文件中的指令代码。
  2. 如何完成反汇编,典型的算法包括:线性扫描和递归下降扫描算法。
    (1)线性扫描算法的优点是能够完全覆盖程序所有代码,缺点是不会通过识别分支等线性指令提取程序的控制流,且没有考虑到代码中混有数据的情况,将数据当成指令解析可能导致无法预估的错误。采用线性扫描反汇编算法的工具有GUN调试器gdb,微软公司的WinDbg调试器和objdump。
    (2)递归下降扫描反汇编算法加入了对控制流指令的深度解析,根据一条指令是否被另一条指令引用来决定是否对其进行反汇编,将CPU指令进行分类处理,处理过程中需要维护一个队列,记录待处理的分支入口,这个队列称为待处理队列。
    优点是能够区分代码与数据,缺点是无法处理间接代码路径,需要对循环进行识别和处理,否则将导致无止境的重复分析。采用递归下降扫描反汇编算法的工具有IDA Pro反汇编工具。

代码混淆

代码混淆是一种将计算机程序代码转换成一种功能上等价,但是难以阅读和理解的变形。

  1. 代码混淆可分为源程序代码混淆和二进制代码混淆。
    (1)源代码的混淆可以将代码中的变量、函数、类的名称改成毫无意义的名字,比如单个字母、无意义的字母组合、字母数字编号等,使得阅读代码者难以猜测其用途。源代码的混淆还可以通过修改代码部分逻辑使其功能等价,但更加难以理解,比如添加无用代码,修改循环为递归,打乱代码格式等。
    (2)二进制代码混淆是应用最为广泛的混淆手段,主要应用于对抗逆向的版权保护和恶意代码的反检测。二进制代码混淆的直接目的就是对抗反汇编,大致会分为两类:其一是“反反汇编”的混淆,即针对反汇编缺陷进行设计使反汇编出错,或者对代码加密混淆使其无法得到真正的运行代码。其二是指令控制流混淆,用来增加理解、分析反汇编代码的难度。

反调试

动态调试分析是最常用的分析方法之一,它能够弥补静态分析中难以处理代码加壳及花指令等混淆的不足。
常见的反调试技术有:
(1)基于调试特征检测的反调试
(2)基于调试特征隐藏代码

文章目录
  1. 1. 处理器硬件架构基础
    1. 1.1. CPU结构
    2. 1.2. 保护模式
    3. 1.3. 特权级
    4. 1.4. 中断处理与异常处理
    5. 1.5. 程序调试
    6. 1.6. 虚拟化支持
  2. 2. 反汇编及对抗技术
    1. 2.1. 汇编语言
    2. 2.2. 反汇编
    3. 2.3. 代码混淆
    4. 2.4. 反调试