一步一步PWN路由器之路由器环境修复&&rop技术分析
字数 1364 2025-08-22 12:22:24
MIPS架构路由器环境修复与ROP技术分析
前言
在路由器安全研究中,获取固件后的首要任务是运行目标程序(通常是web服务程序)。本文将详细介绍如何修复路由器运行环境以及MIPS架构下的ROP利用技术。
一、路由器运行环境修复
1.1 基本方法
路由器程序通常需要从nvram获取配置信息,但在QEMU模拟环境中缺少该设备,导致程序可能因无法获取配置而退出。解决方法:
- 使用nvram-faker工具
- 通过LD_PRELOAD环境变量进行hook
1.2 具体实施步骤
- 根据目标程序使用的C库(glibc或uclibc)选择对应的交叉编译工具链编译nvram-faker
- 修改脚本中的交叉编译工具链路径(如有必要)
- 将编译生成的
libnvram-faker.so和nvram.ini放入根目录 - 使用以下命令运行:
sudo chroot . ./qemu-mips-static -E LD_PRELOAD=/libnvram-faker.so /usr/bin/httpd
1.3 注意事项
- 若程序在其他地方报错,需要分析程序并在nvram-faker中添加hook代码
- 优先使用
qemu-system-mips-static调试 - 如需静态编译程序,建议在qemu-system中编译(比交叉编译更方便)
二、MIPS ROP技术分析
2.1 实验环境搭建
创建一个简单的栈溢出程序用于实验:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void getshell(){
system("sh");
sleep(1);
}
void vulnerable_function() {
char buf[128];
read(STDIN_FILENO, buf, 256);
}
int main(int argc, char** argv) {
printf("%p\n", (int *)write);
vulnerable_function();
write(STDOUT_FILENO, "Hello, World\n", 13);
}
编译命令(使用uclibc交叉编译工具链):
/home/haclh/router_exploit/cross-compiler-mips/bin/mips-gcc level1.c -o level1
2.2 关键ROP Gadgets分析
通过IDA分析uClibc库,找到以下关键gadgets:
- rop_gad1:
LOAD:00055C60 li $a0, 1
LOAD:00055C64 move $t9, $s1
LOAD:00055C68 jalr $t9 ; sub_55960
LOAD:00055C5C lui $s0, 2
- gadg_2:
LOAD:0001E20C move $t9, $s1
LOAD:0001E210 lw $ra, 0x28+var_4($sp)
LOAD:0001E214 lw $s2, 0x28+var_8($sp)
LOAD:0001E218 lw $s1, 0x28+var_C($sp)
LOAD:0001E21C lw $s0, 0x28+var_10($sp)
LOAD:0001E220 jr $t9
LOAD:0001E224 addiu $sp, 0x28
- rop_gad3:
LOAD:000164C0 addiu $s2, $sp, 0x198+var_180
LOAD:000164C4 move $a2, $v1
LOAD:000164C8 move $t9, $s0
LOAD:000164CC jalr $t9 ; mempcpy
LOAD:000164D0 move $a0, $s2
- rop_gad4:
LOAD:000118A4 move $t9, $s2
LOAD:000118A8 jalr $t9
2.3 ROP执行流程
-
初始状态:
sp:0x76fff710- 首先进入
rop_gad1,设置$s1为gadg_2
-
第一次进入gadg_2:
$s1保持为gadg_2- 从内存加载数据到寄存器:
s1→sleepra→rop_gad3s0→rop_gad4
sp:0x76fff738
-
第二次进入gadg_2:
- 寄存器状态:
s1→sleepra→rop_gad3s0→rop_gad4
sp:0x76fff760
- 寄存器状态:
-
进入rop_gad3:
- 获取栈地址到
$s2 - 跳转到
$s0(即rop_gad4)
- 获取栈地址到
-
进入rop_gad4:
s2→0x76fff778- 跳转到栈上执行shellcode
2.4 关键调试技巧
- 在函数返回地址被覆盖时设置断点
- 使用gdb命令手动设置
$pc寄存器值 - 伪造劫持程序流程到
rop_gad1 - 观察每次进入gadget时的寄存器状态变化
三、总结与通用思路
-
环境修复要点:
- 注意使用的gcc版本
- 必要时进行代码跟踪和逆向分析
- 根据实际情况调整运行环境
-
MIPS ROP通用思路:
- 通过多个gadget链式调用
- 利用sleep函数刷新cache
- 获取栈指针后跳转到栈上执行shellcode
- 通过寄存器传递控制流
四、参考资源
- Exploiting a MIPS Stack Overflow
- nvram-faker项目: https://github.com/zcutlip/nvram-faker
通过掌握这些技术,研究人员可以有效地分析和利用MIPS架构路由器中的漏洞,提升IoT设备的安全性研究能力。