逆向入门基础
0x01 处理器硬件框架基础
一、8086汇编基础
1、CPU结构
CPU由寄存器、算术逻辑单元ALU、 控制器和内部总线四部分构成。
寄存器记录了操作系统关键数据结构信息,是软件漏洞与恶意代码分析的基础信息。
寄存器与内存
寄存器是中央处理器内的组成部份(寄存器是CPU内部的元件),是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。
内存一般分为只读存储器(ROM)、随机存储器(RAM)和高速缓存存储器(cache)
。
内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。
CPU按照字长可分为16位、32位和64位。根据字长不同寄存器名称也不一样,如下图。
CPU寄存器
- 通用数据寄存器(GPRs)
------EAX、ECX、EDX、EBX,通常用于存储参与运算的数据及运算结果。
------ECX常被用于存储循环处理指令的循环次数,ECX 常作为C++中的this指针。
------EAX和EDX常作为乘除法指 令的隐含操作数,EAX常作为函数返回值。
- 数据指针寄存器
------ESP记录了当前的栈顶,call、ret、push、pop、pusha、 popa等指令会改变ESP寄存器的值。
------EBP通常记录的是当前函数的栈底,leave指令在函数返回前通过EBP还原ESP。
------ESI和EDI作为变址寄存器。
- 指令指针寄存器
------EIP存储了当前执行指令的地址。系统根据该寄存器进行寻址,从内存中取出指令,然后再译码、执行。
- 标志位寄存器
------ZF零标志等等
- 段寄存器
------实模式下段寄存器通常与指针寄存器如ESP、EDI、 ESI等联合使用,保护模式下需要与述符表结 合使用。
------CPU中的段寄存器:CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、 ES(附加段寄存器)、 FS(附加段寄存器)、GS(附加段寄存器)
- 控制寄存器
------控制寄存器包括CR0、CR1、CR2、CR3、CR4这5个,记录着处理器的运行模式和当前执行任务的属性。
------CR0记录了系统控制标志,控制处理器的运行模式和状态。
------CR1是保留的控制寄存器,用于之后的扩展。
------CR2记录了引起页故障的线性地址。
------CR3是页表寄存器,存储了20位的页目录表的基地址和2个标志位PCD、PWT。
------CR4包含一组标志,用于决定是否启用IA-32架构 上的几个扩展,如虚拟8086模式扩展、调试扩展等。
- 系统地址寄存器
------GDTR是全局述符表寄存器。
------IDTR是中断述符表寄存器。
64位的x86 CPU结构上的变化:在x64中,所有通用寄存器都从32位扩充到了64位, 8个通 用寄存器(EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI)被 重新命名为RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI 。所有算术逻辑操作、寄存器到内存的数据传输都能以64位 的整形类型进行操作。堆栈的压栈和弹出操作都以8字节的 单位进行,指针类型也是64位。
2、汇编语言
汇编语言中使用助记符代表机器指令的操作码(mov等), 使用地址符号或标号代替指令或操作数的地址, 不同的硬件架构对应不同的机器语言指令集,通过汇编过程转换成机器指令。
AT&T汇编格式与Intel汇编格式在寄存器命名规则、源/目的操作数顺序、常数/立即数的格式、操作数长度标识、寻址方式都有差别,具体可查看相关手册。
常用汇编指令:
- StackPivot切换堆栈:xchg eax esp == push eax, pop esp
- 函数调用与返回:编译器的高级优化技术会导致call-ret指令不匹配。
- slide code(滑板指令):NOP slide(堆喷射)
二、保护模式
1、实模式和保护模式
IA-32架构的CPU有2种工作方式:实模式和保护模式。实模式不支持多线程、不能实现权限分级;保护模式下引入内存的分页和分段管理机制,实现了内存分页和权限分级,并支持多线程、多任务。
保护模式内存寻址三种地址:逻辑地址、线性地址、物理地址。分段机制将逻辑地址转换成线性地址。分页机制将线性地址转换成物理地址。
– 逻辑地址(logicaladdress):是机器语言指令中用来指定一个操作
数或者是一条指令的地址。
– 线性地址(linearaddress):是对整个进程内存空间的抽象描述。
– 物理地址(physicaladdress):用于内存芯片级的单元寻址,与 CPU连接的地址总线相对应。
2、特权级
CPU权限级别分4个等级Ring0~Ring3,Windows使用Ring0和 Ring3这2个特权级。特权指令只能运行在Ring0特权级,用户态下无法执行这些指令,需在操作系统内核态下运行。
三、中断和异常处理
中断和异常是程序执行过程中的插曲,需要处理器强 制暂停当前任务,转移到一个称为中断处理程序或者异常处理程序的特殊任务中。处理器响应中断或者异常所采取的行动称为中断服务或者异常处理。
中断是在程序执行期间随机发生,可以是对硬件信号的响应,如鼠标键盘;也可以是软件中断,如INT n指令。
异常是在处理器执行指令过程中发现错误情况产生的, 比如除0错误、保护违例、页故障、内部机器故障。
中断和异常处理
四、调试支持
标志寄存器EFLAGS中的IF、TF标志。8个调试寄存器DR0-DR7。
调试特殊情况
五、虚拟化支持
Intel的VT虚拟化技术。
0x02 反汇编与反编译基础
一、反汇编
反汇编:机器码转换为汇编指令。
反汇编流程步骤:
– 根据可执行文件的格式规范(PE或ELF)确定反汇编的代码区域和代码入口的位置;
– 读取二进制机器指令,执行表查找,将机器码的值与对应的汇编语言助记符取出来,根据指令
状态机取操作数;
– 对汇编语言等价形式进行格式化,输出反汇编代码,可用Intel格式或AT&T格式;
– 重复上述过程,继续反汇编下一条指令,直到反汇编完程序文件中的指令。
反汇编算法主要分为以下两类:
- 线性扫描反汇编算法:优点是能够完全覆盖程序所有代码。缺点是没有考虑到代码中混有数据的情况,将数据当成指令解析可能导致无法预估的错误。采用线性扫反汇编算法的工具有GNU调试器gdb, 微软的WinDbg调试器和GNU Binutils中的objdump。
- 递归下降扫描反汇编算法:递归下降扫反汇编算法加入了对控制流指令的解析,根据指令是否被另一条指令引用来决定是否对其进行反汇编。优点是能够区分代码与数据。缺点是无法处理间接代码路径如jmp eax,call eax等;另外需要对循环进行识别和处理,否则将导致无止境的重复分析。采用递归下降扫反汇编算法的工具有IDA Pro 反汇编工具。
二、编译
编译是将高级语言 (如C/C++)转换成计
算机可以识别的机 器指令的过程。编译可分为六个阶段:词法分析、语法分析、语义分析、 中间代码生成、代码优化、目标代码 生成。
反编译是编译的逆过程,指将可执行文件的机器指令序列转换成人类熟悉的高级语言源程序的过程,其依赖于编译技术。
三、代码混淆
一种将计算机程序代码转换成功能上等价,但是难以阅读和理解的变形技术。可分为源代码混淆,二进制代码混淆。代码混淆常应用于对抗逆向的版权保护和恶意代码的反检测。
代码混淆技术有花指令、加密与加壳保护、控制流混淆等。
0x03 windows操作系统基础
PC平台流行的可执行文件格式主要有Windows下的PE(Portable Executable)和Linux下的ELF(Executable and Linkable Format),它们都COFF(Common File Format)格式的变种。
Windows进程采用EPROCESS结构进行管理。线程是程序执行流的最小单元,是进程中的一个实体,是被操作系统独立调度和分派的基本单位。线程本身不独占系统资源,与同属一个进程的其它线程共享进程所拥有的全部资源。
笔记来源:
1、国科大《软件安全漏洞分析与发现》课程
2、寄存器、内存