一步一步PWN路由器之路由器环境修复&&rop技术分析
字数 1364 2025-08-22 12:22:24

MIPS架构路由器环境修复与ROP技术分析

前言

在路由器安全研究中,获取固件后的首要任务是运行目标程序(通常是web服务程序)。本文将详细介绍如何修复路由器运行环境以及MIPS架构下的ROP利用技术。

一、路由器运行环境修复

1.1 基本方法

路由器程序通常需要从nvram获取配置信息,但在QEMU模拟环境中缺少该设备,导致程序可能因无法获取配置而退出。解决方法:

  1. 使用nvram-faker工具
  2. 通过LD_PRELOAD环境变量进行hook

1.2 具体实施步骤

  1. 根据目标程序使用的C库(glibc或uclibc)选择对应的交叉编译工具链编译nvram-faker
  2. 修改脚本中的交叉编译工具链路径(如有必要)
  3. 将编译生成的libnvram-faker.sonvram.ini放入根目录
  4. 使用以下命令运行:
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:

  1. rop_gad1:
LOAD:00055C60 li $a0, 1
LOAD:00055C64 move $t9, $s1
LOAD:00055C68 jalr $t9 ; sub_55960
LOAD:00055C5C lui $s0, 2
  1. 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
  1. 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
  1. rop_gad4:
LOAD:000118A4 move $t9, $s2
LOAD:000118A8 jalr $t9

2.3 ROP执行流程

  1. 初始状态:

    • sp:0x76fff710
    • 首先进入rop_gad1,设置$s1gadg_2
  2. 第一次进入gadg_2:

    • $s1保持为gadg_2
    • 从内存加载数据到寄存器:
      • s1sleep
      • rarop_gad3
      • s0rop_gad4
    • sp:0x76fff738
  3. 第二次进入gadg_2:

    • 寄存器状态:
      • s1sleep
      • rarop_gad3
      • s0rop_gad4
    • sp:0x76fff760
  4. 进入rop_gad3:

    • 获取栈地址到$s2
    • 跳转到$s0(即rop_gad4
  5. 进入rop_gad4:

    • s20x76fff778
    • 跳转到栈上执行shellcode

2.4 关键调试技巧

  1. 在函数返回地址被覆盖时设置断点
  2. 使用gdb命令手动设置$pc寄存器值
  3. 伪造劫持程序流程到rop_gad1
  4. 观察每次进入gadget时的寄存器状态变化

三、总结与通用思路

  1. 环境修复要点:

    • 注意使用的gcc版本
    • 必要时进行代码跟踪和逆向分析
    • 根据实际情况调整运行环境
  2. MIPS ROP通用思路:

    • 通过多个gadget链式调用
    • 利用sleep函数刷新cache
    • 获取栈指针后跳转到栈上执行shellcode
    • 通过寄存器传递控制流

四、参考资源

通过掌握这些技术,研究人员可以有效地分析和利用MIPS架构路由器中的漏洞,提升IoT设备的安全性研究能力。

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 放入根目录 使用以下命令运行: 1.3 注意事项 若程序在其他地方报错,需要分析程序并在nvram-faker中添加hook代码 优先使用 qemu-system-mips-static 调试 如需静态编译程序,建议在qemu-system中编译(比交叉编译更方便) 二、MIPS ROP技术分析 2.1 实验环境搭建 创建一个简单的栈溢出程序用于实验: 编译命令(使用uclibc交叉编译工具链): 2.2 关键ROP Gadgets分析 通过IDA分析uClibc库,找到以下关键gadgets: rop_ gad1 : gadg_ 2 : rop_ gad3 : rop_ gad4 : 2.3 ROP执行流程 初始状态 : sp:0x76fff710 首先进入 rop_gad1 ,设置 $s1 为 gadg_2 第一次进入gadg_ 2 : $s1 保持为 gadg_2 从内存加载数据到寄存器: s1 → sleep ra → rop_gad3 s0 → rop_gad4 sp:0x76fff738 第二次进入gadg_ 2 : 寄存器状态: s1 → sleep ra → rop_gad3 s0 → 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设备的安全性研究能力。