异架构入门
字数 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类似,可覆盖返回地址
  • 叶子函数:需溢出大量数据覆盖父函数返回地址

例题分析:

  1. ret2win_mipsel

    • 计算溢出点:padding=0x38+4-0x18=36
    • 直接控制返回地址为后门函数
  2. split

    • 需要控制\(ra和\)a0执行system("/bin/cat flag.txt")
    • 使用gadget:ROPgadget --binary "./split_mipsel" | grep -E ": lw .*a0, .*sp"
  3. Mplogin

    • NX未开启,考虑shellcode
    • 利用read溢出泄露栈地址,控制返回地址为shellcode
  4. 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漏洞利用

例题分析:

  1. typo(ret2text)

    • 静态编译,去除符号表
    • 通过调试找到主函数
    • 使用cyclic -l确定溢出值
    • 控制r0为"/bin/sh",pc为system
  2. chall(ret2libc)

    • 利用base64绕过检查
    • 寻找控制r0、r1的gadget
    • 泄露libc后构造ROP链
  3. baby_arm(ret2csu)

    • 利用ret2csu控制多个寄存器
    • 构造mprotect参数(x0=buf, x1=length, x2=prot)
    • 注意栈布局:ldp x29, x30, [sp], #0x10

四、调试技巧

  1. GDB调试

    • 设置共享库查找路径防止加载宿主机库
    • 脚本调试更高效
  2. 工具推荐

    • mipsrop:查找MIPS架构的ROP gadget
    • ROPgadget:通用ROP工具
    • shellcraft:生成shellcode
  3. 常见问题解决

    • 安装binutils依赖:sudo apt install binutils-aarch64-linux-gnu
    • 符号表恢复:有助于分析静态编译程序

五、总结

  1. 异架构Pwn与x86思路相似,需掌握特定架构特性
  2. 重点掌握:
    • 寄存器用途
    • 函数调用约定
    • 栈布局
    • 漏洞利用方法
  3. 调试是关键,需熟悉工具链
  4. 实际应用中需灵活组合各种技术

六、扩展学习

  1. 深入研究堆利用技术
  2. 探索更多架构(如PPC、SPARC等)
  3. 实战演练复杂场景下的漏洞利用
  4. 关注实际设备中的安全漏洞案例
异架构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: 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 符号表恢复:有助于分析静态编译程序 五、总结 异架构Pwn与x86思路相似,需掌握特定架构特性 重点掌握: 寄存器用途 函数调用约定 栈布局 漏洞利用方法 调试是关键,需熟悉工具链 实际应用中需灵活组合各种技术 六、扩展学习 深入研究堆利用技术 探索更多架构(如PPC、SPARC等) 实战演练复杂场景下的漏洞利用 关注实际设备中的安全漏洞案例