基于静态分析的路由器固件二进制漏洞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. 固件解包与分析

  1. 使用binwalk解包固件
  2. 解包后可能需要赋予写权限:
    sudo chmod -R 777 squashfs-root/
    
  3. 主要分析目标:bin/httpd文件

二、固件仿真与调试

1. 仿真设置

  1. 建立虚拟网桥
  2. 复制qemu-arm-static到当前目录
  3. 启动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. 漏洞定位

  1. 在IDA中搜索关键字符串(如"WeLoveLinux")
  2. 查看交叉引用找到关键函数
  3. 定位存在缓冲区溢出的函数(如formexeCommand

2. 漏洞验证

  1. 构造简单payload(如1000个'a')
  2. 发送payload观察是否导致程序崩溃(段错误)

3. 漏洞利用步骤

  1. 计算偏移量

    • 使用pwntools的cyclic生成测试字符串
    • 通过崩溃时的PC值计算精确偏移(如cyclic查找"xaah"对应792)
  2. 寻找ROP链

    • 控制r0的gadget(如0x00040cb8
    • pop到r3的gadget(如0x00018298
  3. 获取libc基地址

    • 在函数开头下断点
    • 使用gdb的vmmap命令查看
  4. 构造payload

    • 填充偏移量
    • 添加ROP链
    • 设置函数参数(如system地址和参数)

4. 效果验证

成功执行命令(如打印"helloworld"或反弹shell)

四、特殊RCE漏洞分析

1. 漏洞特点

  • 非传统栈溢出
  • 通过控制内存加载实现RCE
  • 缓冲区未溢出但能控制执行流

2. 利用过程

  1. 使用cyclic定位关键点

  2. 发现程序在ldrb指令崩溃(加载错误地址)

  3. 构造payload:

    • 填充到关键偏移(如235字节)
    • 添加有效地址(如程序起始地址0x0064920)
    • 继续填充并控制PC
  4. 处理ARM/Thumb模式切换问题:

    • 通过试验确定第一个字符(从'a'开始尝试)

3. 利用效果

成功实现二次打印关键字符串或执行任意命令

五、常见问题解决

1. IDA返回地址不显示

原因:执行流未在漏洞函数返回,被其他函数干扰

解决方案

  • 参照非传统溢出案例
  • 关注程序实际崩溃点

2. gdb发送payload后中断

可能原因

  1. 未安装对应架构的libc库
  2. gdb架构设置不正确

解决方案

  • 安装正确的libc库
  • 设置gdb架构:
    set architecture arm
    

六、总结与进阶

1. 关键要点

  1. 细心计算缓冲区偏移和地址
  2. 精确控制程序执行流
  3. 大胆尝试各种可能性

2. 进阶方向

  1. 扩展目标设备(不只是路由器)
  2. 研究堆漏洞利用技术
  3. 深入IOT设备安全研究

附录:常用命令速查

命令/操作 用途
qemu-arm-static -g 9999 启动ARM程序并开启调试
gdb-multiarch ./httpd 启动gdb调试ARM程序
target remote :9999 gdb连接远程调试
vmmap 查看内存映射
cyclic 1000 生成测试字符串
cyclic -l xaah 计算偏移量
基于静态分析的路由器固件二进制漏洞RCE技术详解 一、准备工作 1. 环境配置 这条命令安装: qemu-user-static:用于在x86架构主机上运行ARM架构程序 ARM架构的GNU C库及其开发包:避免gdb调试时程序直接退出 2. 固件解包与分析 使用binwalk解包固件 解包后可能需要赋予写权限: 主要分析目标: bin/httpd 文件 二、固件仿真与调试 1. 仿真设置 建立虚拟网桥 复制qemu-arm-static到当前目录 启动qemu仿真: -g 参数设置调试端口 2. 常见问题解决 问题1 :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 ) 获取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架构: 六、总结与进阶 1. 关键要点 细心计算缓冲区偏移和地址 精确控制程序执行流 大胆尝试各种可能性 2. 进阶方向 扩展目标设备(不只是路由器) 研究堆漏洞利用技术 深入IOT设备安全研究 附录:常用命令速查 | 命令/操作 | 用途 | |----------|------| | qemu-arm-static -g 9999 | 启动ARM程序并开启调试 | | gdb-multiarch ./httpd | 启动gdb调试ARM程序 | | target remote :9999 | gdb连接远程调试 | | vmmap | 查看内存映射 | | cyclic 1000 | 生成测试字符串 | | cyclic -l xaah | 计算偏移量 |