异架构入门
字数 2866 2025-08-29 22:41:01
异架构Pwn入门:MIPS/ARM环境配置与漏洞利用
一、环境配置
1. QEMU安装与配置
QEMU是一个支持跨平台虚拟化的虚拟机,有两种配置方式:
-
System Mode:模拟整个计算机系统,可在QEMU上运行操作系统
- 优势:支持跨指令集(如在x86上虚拟ARM计算机)
- 安装命令:
sudo apt install qemu-system
-
User Mode:运行不同平台的可执行程序
- 要求:必须同一种操作系统(如Linux)
- 安装命令:
sudo apt install qemu-user
2. GDB调试工具
安装支持多架构的GDB:
sudo apt install gdb-multiarch
3. 动态链接库安装
安装对应架构的动态链接库,安装后会在/usr/目录下看到相关文件。
二、MIPS架构分析
1. MIPS基础
MIPS(Microprocessor without Interlocked Pipeline Stages)是一种RISC架构:
- 最早32位,最新版本64位
- 常见于路由器、嵌入式系统等
- CTF考点:ret2text、ret2libc、ret2shellcode、堆题目
2. MIPS寄存器用途
| 寄存器 | 名称 | 用途 |
|---|---|---|
| $0 | $zero | 存储常量0 |
| $1 | $at | 保留给汇编器 |
| \(2-\)3 | \(v0-\)v1 | 函数返回值或表达式结果 |
| \(4-\)7 | \(a0-\)a3 | 函数调用的前四个参数 |
| \(8-\)15 | \(t0-\)t7 | 临时寄存器 |
| \(16-\)23 | \(s0-\)s7 | 保存调用子函数前的寄存器值 |
| \(24-\)25 | \(t8-\)t9 | 补充临时寄存器 |
| \(26-\)27 | \(k0-\)k1 | 中断/异常处理程序使用 |
| $28 | $gp | 全局指针 |
| $29 | $sp | 堆栈指针 |
| $30 | $fp | 帧指针 |
| $31 | $ra | 返回地址 |
3. MIPS32函数调用机制
- 栈操作:从高地址向低地址增长,无ebp/rbp指针
- 函数调用:
- 前4个参数通过\(a0-\)a3传递
- 多余参数放入调用参数空间
- 返回地址存入$RA寄存器而非堆中
- 函数类型:
- 叶子函数:不调用其他函数,直接使用"jr $RA"返回
- 非叶子函数:保存返回地址到栈中,返回时从栈取出
4. MIPS漏洞利用
缓冲区溢出利用:
- 非叶子函数:与x86类似,可覆盖返回地址
- 叶子函数:需溢出大量数据覆盖父函数返回地址
例题分析:
-
ret2win_mipsel:
- 计算溢出点:
padding=0x38+4-0x18=36 - 直接控制返回地址为后门函数
- 计算溢出点:
-
split:
- 需要控制\(ra和\)a0执行system("/bin/cat flag.txt")
- 使用gadget:
ROPgadget --binary "./split_mipsel" | grep -E ": lw .*a0, .*sp"
-
Mplogin:
- NX未开启,考虑shellcode
- 利用read溢出泄露栈地址,控制返回地址为shellcode
-
retlibc:
- 利用gadget泄露libc地址
- 构造system的ROP链
三、ARM架构分析
1. ARM基础
- ARM:32位架构
- AARCH64:64位架构
- 常见于移动设备、嵌入式系统
2. 函数调用约定
ARM(32位):
- 前4个参数:r0-r3
- 多余参数:从右向左入栈
- 返回值:r0
- 被调用者实现栈平衡
AARCH64(64位):
- 前6个参数:x0-x5
- 调用者负责栈平衡
- 返回值:x0(大数据类型可能使用x0和x1)
3. 常见汇编指令
| 指令 | 功能描述 |
|---|---|
| MOV | 数据传输 |
| ADD/SUB | 加减法 |
| CMP | 比较操作数 |
| B | 无条件跳转 |
| BL | 跳转并将返回地址存入LR寄存器 |
| LDR/STR | 内存读写 |
| PUSH/POP | 栈操作 |
4. ARM漏洞利用
例题分析:
-
typo(ret2text):
- 静态编译,去除符号表
- 通过调试找到主函数
- 使用
cyclic -l确定溢出值 - 控制r0为"/bin/sh",pc为system
-
chall(ret2libc):
- 利用base64绕过检查
- 寻找控制r0、r1的gadget
- 泄露libc后构造ROP链
-
baby_arm(ret2csu):
- 利用ret2csu控制多个寄存器
- 构造mprotect参数(x0=buf, x1=length, x2=prot)
- 注意栈布局:
ldp x29, x30, [sp], #0x10
四、调试技巧
-
GDB调试:
- 设置共享库查找路径防止加载宿主机库
- 脚本调试更高效
-
工具推荐:
- mipsrop:查找MIPS架构的ROP gadget
- ROPgadget:通用ROP工具
- shellcraft:生成shellcode
-
常见问题解决:
- 安装binutils依赖:
sudo apt install binutils-aarch64-linux-gnu - 符号表恢复:有助于分析静态编译程序
- 安装binutils依赖:
五、总结
- 异架构Pwn与x86思路相似,需掌握特定架构特性
- 重点掌握:
- 寄存器用途
- 函数调用约定
- 栈布局
- 漏洞利用方法
- 调试是关键,需熟悉工具链
- 实际应用中需灵活组合各种技术
六、扩展学习
- 深入研究堆利用技术
- 探索更多架构(如PPC、SPARC等)
- 实战演练复杂场景下的漏洞利用
- 关注实际设备中的安全漏洞案例