基于静态分析的路由器固件二进制漏洞RCE技术经验分享
字数 1502 2025-08-29 22:41:24
基于静态分析的路由器固件二进制漏洞RCE技术详解
一、准备工作
1. 环境配置
sudo apt install qemu-user-static libc6-arm* libc6-dev-arm*
这条命令安装:
- qemu-user-static:用于在x86架构主机上运行ARM架构程序
- ARM架构的GNU C库及其开发包:避免gdb调试时程序直接退出
2. 固件解包与分析
- 使用binwalk解包固件
- 解包后可能需要赋予写权限:
sudo chmod -R 777 squashfs-root/ - 主要分析目标:
bin/httpd文件
二、固件仿真与调试
1. 仿真设置
- 建立虚拟网桥
- 复制qemu-arm-static到当前目录
- 启动qemu仿真:
sudo qemu-arm-static -g 9999 -L ./ ./bin/httpd-g参数设置调试端口
2. 常见问题解决
问题1:httpd文件执行权限问题
chmod +x httpd
问题2:程序死循环patch
- 使用IDA找到死循环位置
- 修改ARM汇编指令(如将
MOV R3,R0改为MOV R3,#1) - 保存patch结果
三、栈溢出漏洞利用
1. 漏洞定位
- 在IDA中搜索关键字符串(如"WeLoveLinux")
- 查看交叉引用找到关键函数
- 定位存在缓冲区溢出的函数(如
formexeCommand)
2. 漏洞验证
- 构造简单payload(如1000个'a')
- 发送payload观察是否导致程序崩溃(段错误)
3. 漏洞利用步骤
-
计算偏移量:
- 使用pwntools的cyclic生成测试字符串
- 通过崩溃时的PC值计算精确偏移(如cyclic查找"xaah"对应792)
-
寻找ROP链:
- 控制r0的gadget(如
0x00040cb8) - pop到r3的gadget(如
0x00018298)
- 控制r0的gadget(如
-
获取libc基地址:
- 在函数开头下断点
- 使用gdb的
vmmap命令查看
-
构造payload:
- 填充偏移量
- 添加ROP链
- 设置函数参数(如system地址和参数)
4. 效果验证
成功执行命令(如打印"helloworld"或反弹shell)
四、特殊RCE漏洞分析
1. 漏洞特点
- 非传统栈溢出
- 通过控制内存加载实现RCE
- 缓冲区未溢出但能控制执行流
2. 利用过程
-
使用cyclic定位关键点
-
发现程序在
ldrb指令崩溃(加载错误地址) -
构造payload:
- 填充到关键偏移(如235字节)
- 添加有效地址(如程序起始地址0x0064920)
- 继续填充并控制PC
-
处理ARM/Thumb模式切换问题:
- 通过试验确定第一个字符(从'a'开始尝试)
3. 利用效果
成功实现二次打印关键字符串或执行任意命令
五、常见问题解决
1. IDA返回地址不显示
原因:执行流未在漏洞函数返回,被其他函数干扰
解决方案:
- 参照非传统溢出案例
- 关注程序实际崩溃点
2. gdb发送payload后中断
可能原因:
- 未安装对应架构的libc库
- gdb架构设置不正确
解决方案:
- 安装正确的libc库
- 设置gdb架构:
set architecture arm
六、总结与进阶
1. 关键要点
- 细心计算缓冲区偏移和地址
- 精确控制程序执行流
- 大胆尝试各种可能性
2. 进阶方向
- 扩展目标设备(不只是路由器)
- 研究堆漏洞利用技术
- 深入IOT设备安全研究
附录:常用命令速查
| 命令/操作 | 用途 |
|---|---|
qemu-arm-static -g 9999 |
启动ARM程序并开启调试 |
gdb-multiarch ./httpd |
启动gdb调试ARM程序 |
target remote :9999 |
gdb连接远程调试 |
vmmap |
查看内存映射 |
cyclic 1000 |
生成测试字符串 |
cyclic -l xaah |
计算偏移量 |