下面整理 AArch64、RISC-V64、MIPS32 三种架构的:
- 寄存器体系
- 常用汇编指令分类
- 寻址方式
- 函数调用流程
- 函数序言(prologue)
- 函数主体访问栈变量
- 函数尾声(epilogue)
- 逆向分析识别规律
一、AArch64 (ARM64)
1. 寄存器体系
AArch64 有:
其中:
| 寄存器 | 用途 |
|---|---|
| X0-X7 | 函数参数/返回值 |
| X8 | 间接返回地址 |
| X9-X15 | 临时 |
| X16-X17 | IP临时 |
| X19-X28 | callee saved |
| X29 | FP(frame pointer) |
| X30 | LR(link register) |
| SP | stack pointer |
| PC | 程序计数器 |
2. 常用数据搬运指令
MOV
寄存器复制:
等价:
立即数:
LDR
Load:
含义:
带偏移:
等价:
STR
Store:
含义:
LDP/STP
ARM64 特有:
Load Pair:
一次加载两个寄存器。
Store Pair:
一次保存:
常用于函数入口。
3. 算术指令
ADD
:
立即数:
SUB
:
MUL
MADD
乘加:
:
4. 比较和跳转
CMP
实际上:
等价:
设置flag。
条件跳转
相等:
不等:
大于:
无条件跳转
函数调用
作用:
返回
实际:
5. ARM64 函数结构
标准函数序言
执行:
栈:
6. 保存callee寄存器
例如:
保存:
因为:
调用前后必须一致。
7. 参数访问
函数:
入口:
例如:
:
8. ARM64函数尾声
标准:
恢复:
返回:
二、RISC-V64
1. 寄存器体系
32个整数寄存器:
ABI:
| 寄存器 | 名称 | 用途 |
|---|---|---|
| x0 | zero | 恒0 |
| x1 | ra | 返回地址 |
| x2 | sp | 栈 |
| x3 | gp | 全局指针 |
| x4 | tp | 线程指针 |
| x5-x7 | t0-t2 | 临时 |
| x8 | s0/fp | frame pointer |
| x9 | s1 | 保存 |
| x10-x17 | a0-a7 | 参数 |
| x18-x27 | s2-s11 | 保存 |
| x28-x31 | t3-t6 | 临时 |
2. 数据移动
LI
load immediate:
:
MV
:
LD
64bit load:
:
SD
store:
:
3. 算术
ADD
:
ADDI
立即数:
:
SUB
MUL
4. 逻辑指令
AND:
OR:
XOR:
5. 比较跳转
BEQ
:
BNE
JAL
函数调用:
效果:
JALR
返回:
等价:
6. RISC-V64函数序言
标准:
布局:
7. 参数
例如:
进入:
返回:
8. 尾声
三、MIPS32 O32
1. 寄存器体系
32个:
ABI名称:
| 寄存器 | 用途 |
|---|---|
| $zero | 0 |
| $at | 汇编器 |
| \(v0-\)v1 | 返回值 |
| \(a0-\)a3 | 参数 |
| \(t0-\)t9 | 临时 |
| \(s0-\)s7 | 保存 |
| $gp | 全局 |
| $sp | 栈 |
| \(fp/\)s8 | 帧 |
| $ra | 返回地址 |
2. 数据移动
LI
MOVE
LW
load word:
:
SW
store word:
3. 算术
ADD
ADDIU
立即数:
SUB
MULT
乘法:
结果:
取:
4. 分支
BEQ
BNE
J
跳转:
JAL
调用:
执行:
注意:
MIPS delay slot:
nop 会先执行。
5. MIPS函数序言
典型:
布局:
6. 参数访问
C:
进入:
第五参数:
7. 返回
返回值:
例如:
8. MIPS尾声
四、三种架构关键指令对应表
| 功能 | ARM64 | RISC-V64 | MIPS32 |
|---|---|---|---|
| 立即数移动 | mov | li | li |
| 寄存器移动 | mov | mv | move |
| load | ldr | ld | lw |
| store | str | sd | sw |
| 加法 | add | add | add |
| 立即数加 | add #imm |
addi | addiu |
| 减法 | sub | sub | sub |
| 乘法 | mul | mul | mult |
| 比较 | cmp | sub/slti | slt |
| 条件跳转 | b.eq | beq | beq |
| 无条件跳转 | b | jal | j |
| 函数调用 | bl | jal | jal |
| 返回 | ret | jalr | jr ra |
五、逆向识别速查
ARM64
看到:
= 函数开始
看到:
= 函数结束
RISC-V64
看到:
= 函数序言
看到:
= 返回
MIPS32
看到:
= 函数入口
看到:
= 返回