学习逆向的背景知识(自用)
常见的寄存器
-
指令指针(程序计数器) IP EIP RIP 寄存下一个指令的地址
-
通用寄存器:
-
累加器寄存器 EAX RAX 寄存算术运算结果
-
基址寄存器 EBX RBX 寄存引用偏移量的基址
-
计数寄存器 ECX RCX 用于循环等计数操作
-
数据寄存器 EDX RDX 用于乘除操作
-
堆栈指针 ESP RSP 指向堆栈顶部
-
基指针寄存器 EBP RBP 用于访问栈传递的参数
-
源索引寄存器 ESI RSI 用于字符串操作,与数据段(DS)寄存器一起作为偏移量使用
-
目标索引寄存器 EDI RDI 用于字符串操作,与附加段(ES)寄存器一起作为偏移量使用
-
不存在于32位系统的寄存器:R8-R15
-
状态标志寄存器(Status Flag Registers) EFLAGS RFLAGS 存储状态标志
- 零标志(ZERO FLAG)用 ZF 表示,零标志指示最后一次执行的指令的结果是否为零。例如,如果执行一条指令将 RAX 减去自身,结果将为 0。在这种情况下,ZF 将被设置为 1。
- 进位标志(Carry Flag)由 CF 表示,进位标志指示最后一次执行的指令结果是否太大或太小,无法存储在目标位置。例如,如果我们把 0xFFFFFFFF 和 0x00000001 相加,并将结果存储在一个 32 位寄存器中,结果将太大无法容纳在寄存器中。在这种情况下,CF 将被设置为 1。
- 符号标志(Sign Flag)符号标志(SF)指示运算结果是否为负数或最高有效位是否被设置为 1。如果满足这些条件,SF 将被设置为 1;否则,设置为 0。
- 陷进标志(Trap Flag)陷阱标志(TF)表示处理器是否处于调试模式。当 TF 被设置时,CPU 会逐条指令执行以用于调试目的。这可以被恶意软件用来识别它们是否在调试器中运行。
General Registers 通用寄存器 Segment Registers 段寄存器 Status Registers 状态寄存器 Instruction Pointer 指令指针 RAX, EAX, AX, AH, AL CS EFLAGS EIP, RIP RBX, EBX, BX, BH, BL RBX,EBX,BX,BH,BL SS RCX, ECX, CX, CH, CL DS RDX, EDX, DX, DH, DL ES RBP, EBP, BP FS RSP, ESP, SP GS RSI, ESI, SI RDI, EDI, DI R8-R15 -
段寄存器(Segment Registers)将平坦的内存空间转换为不同的段,以便更容易地进行寻址。
-
代码段(CS)指向内存中的代码段
-
数据段(DS)指向内存中程序的 数据部分
-
堆栈段(SS)指向内存中程序的堆栈
-
附加段(ES、FS、GS)这些附加段寄存器指向不同的数据部分。它们和 DS 寄存器将程序的内存划分为四个不同的数据部分
常见的汇编指令
1.数据传输指令
这些指令用于在寄存器、内存和立即数之间移动数据
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
MOV | MOV dst, src |
将数据从源(寄存器/内存/立即数)复制到目标(寄存器/内存)。 | mov eax, ebx (将 ebx 值复制到 eax ) |
MOVZX | MOVZX dst, src |
零扩展:将小尺寸数据(如字节)复制到大尺寸寄存器,高位补 0。 | movzx eax, bl (bl 字节扩展到 eax ) |
MOVSX | MOVSX dst, src |
符号扩展:将带符号小尺寸数据复制到大寄存器,保持符号。 | movsx eax, bl (bl 带符号扩展到 eax ) |
LEA | LEA dst, [addr] |
加载有效地址:将内存地址(而非内容)存入目标寄存器。 | lea eax, [ebx+4] (ebx+4 的地址存入 eax ) |
PUSH | PUSH src |
将数据压入栈顶,栈指针(ESP)减小。 | push eax (eax 值压入栈) |
POP | POP dst |
从栈顶弹出数据到目标,ESP 增加。 | pop eax (栈顶值弹出到 eax ) |
XCHG | XCHG dst, src |
交换两个操作数的内容。 | xchg eax, ebx (交换 eax 和 ebx ) |
2.算数运算指令
用于执行数学运算,如加减乘除。
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
MOV | MOV dst, src |
将数据从源(寄存器/内存/立即数)复制到目标(寄存器/内存)。 | mov eax, ebx (将 ebx 值复制到 eax ) |
MOVZX | MOVZX dst, src |
零扩展:将小尺寸数据(如字节)复制到大尺寸寄存器,高位补 0。 | movzx eax, bl (bl 字节扩展到 eax ) |
MOVSX | MOVSX dst, src |
符号扩展:将带符号小尺寸数据复制到大寄存器,保持符号。 | movsx eax, bl (bl 带符号扩展到 eax ) |
LEA | LEA dst, [addr] |
加载有效地址:将内存地址(而非内容)存入目标寄存器。 | lea eax, [ebx+4] (ebx+4 的地址存入 eax ) |
PUSH | PUSH src |
将数据压入栈顶,栈指针(ESP)减小。 | push eax (eax 值压入栈) |
POP | POP dst |
从栈顶弹出数据到目标,ESP 增加。 | pop eax (栈顶值弹出到 eax ) |
XCHG | XCHG dst, src |
交换两个操作数的内容。 | xchg eax, ebx (交换 eax 和 ebx ) |
3.逻辑运算指令
用于位操作和逻辑运算。
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
AND | AND dst, src |
目标 &= 源(按位与),常用于清零或掩码。 | and eax, 0xFF (保留 eax 低 8 位) |
OR | OR dst, src |
目标 | = 源(按位或)。 |
XOR | XOR dst, src |
目标 ^= 源(按位异或),常用于清零(xor eax, eax )。 |
xor eax, eax (eax = 0 ) |
NOT | NOT dst |
目标按位取反。 | not eax (eax = ~eax ) |
SHL | SHL dst, count |
左移,空位补 0,溢出位存 CF。 | shl eax, 2 (eax << 2 ) |
SHR | SHR dst, count |
右移,空位补 0。 | shr eax, 2 (eax >> 2 ) |
4.控制流指令
用于跳转、调用和返回,控制程序执行流。
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
JMP | JMP addr |
无条件跳转到指定地址。 | jmp 0x8048000 (跳转到地址) |
JE/JZ | JE addr |
零标志(ZF=1)时跳转(等于)。 | je label (相等时跳转) |
JNE/JNZ | JNE addr |
零标志(ZF=0)时跳转(不等于)。 | jne label (不等时跳转) |
CALL | CALL addr |
调用函数,压入返回地址后跳转。 | call 0x8048000 (调用函数) |
RET | RET |
从栈弹出返回地址,跳转到该地址。 | ret (返回调用者) |
INT | INT n |
触发中断,调用系统服务。 | int 0x80 (Linux 系统调用) |
5.比较与测试指令
用于比较或测试数据,设置标志位以供条件跳转。
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
CMP | CMP op1, op2 |
比较 op1 和 op2(op1 - op2),设置标志位(如 ZF、CF)。 | cmp eax, ebx (比较 eax 和 ebx ) |
TEST | TEST op1, op2 |
按位与,设置标志位,通常检查是否为 0。 | test eax, eax (检查 eax 是否为 0) |
6.栈操作指令
直接操作栈,常用于函数调用和参数传递。
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
PUSH | PUSH src |
压栈,ESP 减小(32 位减 4,64 位减 8)。 | push 0x68732f2f (压入 //sh ) |
POP | POP dst |
弹栈,ESP 增加。 | pop ebx (弹栈到 ebx ) |
PUSHAD | PUSHAD |
压入所有通用寄存器(32 位)。 | pushad (保存寄存器状态) |
POPAD | POPAD |
弹出所有通用寄存器(32 位)。 | popad (恢复寄存器状态) |
7.系统调用相关指令
用于触发操作系统服务(Linux 常见)。
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
INT 0x80 | INT 0x80 |
32 位 Linux 系统调用,调用号在 eax ,参数在 ebx 、ecx 、edx 等。 |
mov eax, 0xb; int 0x80 (调用 execve ) |
SYSCALL | SYSCALL |
64 位 Linux 系统调用,调用号在 rax ,参数在 rdi 、rsi 、rdx 等。 |
mov rax, 59; syscall (64 位 execve ) |
8.其他常见指令
指令 | 格式 | 意义 | 示例 |
---|---|---|---|
NOP | NOP |
空操作,占 1 字节(0x90 ),用于填充或延迟。 |
nop (无操作) |
HLT | HLT |
暂停 CPU,直到中断。 | hlt (停止执行) |
CLI | CLI |
禁用中断。 | cli (禁止中断) |
STI | STI |
启用中断。 | sti (允许中断) |