-
-
[原创]看雪QEMU 用户态模拟与 ConnectCfm 绕过实战
-
发表于: 1天前 213
-
一、前言
二、环境准备
三、提取文件系统(回顾)
四、QEMU 用户态模拟
4.1 第一次尝试:直接启动
4.2 问题分析:connect cfm failed
4.3 定位问题:Ghidra 分析 ConnectCfm
五、Patch ConnectCfm
5.1 找到调用位置
5.2 修改汇编指令
5.3 导出并替换
六、创建虚拟网卡
七、最终验证
八、总结
一、前言
在上一篇文章《Tenda AC15 固件逆向分析:从解包到命令注入漏洞挖掘》中,我们完成了固件解包、文件系统提取和静态分析,发现了 httpd 程序中的可疑函数 ConnectCfm。
本文是第二篇,我们将使用 QEMU 用户态模拟 让 httpd 程序在 Ubuntu 上运行起来,并通过 patch 二进制文件绕过 ConnectCfm 检查,最终在浏览器中看到路由器的登录页面。
环境:Ubuntu 22.04,固件版本 US_AC15V1.0BR_V15.03.05.19
二、环境准备
# 安装 QEMU 用户态模拟器
sudo apt install qemu-user-static -y
# 安装网桥工具(后续需要)
sudo apt install bridge-utils -y
三、提取文件系统(回顾)
从上一篇文章我们知道,SquashFS 文件系统从偏移量 0x1C9E98(1875608 字节)开始。使用 dd 提取并挂载:
dd if=US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin of=squashfs.bin bs=1 skip=1875608
mkdir squashfs-mount
sudo mount -t squashfs squashfs.bin squashfs-mount/ -o loop
由于 SquashFS 是只读的,我们需要复制一份到可读写目录:
sudo cp -a squashfs-mount/. squashfs-rw/
sudo chown -R topeet:topeet squashfs-rw/
cp /usr/bin/qemu-arm-static squashfs-rw/
此时 squashfs-rw/ 目录下就是完整的路由器文件系统,并且包含了 QEMU 模拟器。
四、QEMU 用户态模拟
4.1 第一次尝试:直接启动
sudo chroot squashfs-rw/ ./qemu-arm-static ./bin/httpd
输出如下:
init_core_dump 1816: rlim_cur = 0, rlim_max = 0
...
Yes:
****** WeLoveLinux******
Welcome to ...
connect: No such file or directory
Connect to server failed.
connect cfm failed!
程序打印 connect cfm failed! 后退出。这是因为 httpd 在启动时需要连接一个名为 cfm 的服务(博通芯片的配置管理服务),这个服务在模拟环境中不存在。
4.2 问题分析
我们需要让 httpd 绕过这个检查,而不是真正去实现 cfm 服务。方法就是:修改二进制文件,让调用 ConnectCfm 的地方直接返回成功。
五、Patch ConnectCfm
5.1 定位调用位置
用 Ghidra 打开 httpd,搜索字符串 ConnectCfm。在 Symbol References 窗口中找到 3 个调用位置:
地址 | 所在函数 |
0002e530 | FUN_0002e420 |
00038410 | FUN_00038254 |
Entry Point | 可忽略 |
5.2 修改汇编指令
以 0002e530 为例,原指令为:
asm
0002e530 bl <EXTERNAL>::ConnectCfm
在 ARM 架构中,bl 指令用于调用函数,返回值存放在 R0 寄存器中。我们将其改为直接设置 R0 = 1(表示成功):
asm
0002e530 mov r0, #1
修改步骤(Ghidra):
- 右键点击指令 → Patch Program → Change Instruction
- 输入 mov r0, #1 → 确定
同样修改 00038410 处的 bl ConnectCfm。
5.3 导出并替换
File → Export Program → 格式选择 Original File → 保存为 httpd_patched。
# 替换原文件
cp httpd_patched squashfs-rw/bin/httpd
六、创建虚拟网卡
httpd 启动时会绑定到名为 br0 的网卡。我们需要手动创建:
sudo brctl addbr br0
sudo ip addr add 192.168.0.1/24 dev br0
sudo ip link set br0 up
七、最终验证
重新启动 httpd:
sudo chroot squashfs-rw/ ./qemu-arm-static ./bin/httpd
输出如下:
...
httpd listen ip = 192.168.0.1 port = 80
webs: Listening for HTTP requests at address 192.168.0.1
没有出现 connect cfm failed! 错误!
打开浏览器,访问 b14K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5&6x3W2)9J5k6e0p5$3z5q4)9J5k6e0m8Q4x3X3f1I4i4@1g2r3i4@1u0o6i4K6W2m8
![登录页面截图]
成功看到 Tenda AC15 的 Web 登录界面。
八、总结
本文完成了以下工作:
步骤 | 说明 |
1. QEMU 环境搭建 | 安装 qemu-arm-static,复制到文件系统 |
2. 问题定位 | 发现 connect cfm failed 错误 |
3. 静态分析 | 用 Ghidra 定位 ConnectCfm 调用位置 |
4. Patch 二进制 | 将 bl ConnectCfm 改为 mov r0, #1 |
5. 网络配置 | 创建 br0 虚拟网卡 |
6. 验证成功 | 浏览器访问到登录页面 |
核心原理:
- QEMU:将 ARM 指令翻译为 x86 指令,让程序能运行
- chroot:切换根目录,让程序找到正确的库和配置文件
- br0:虚拟网卡,让程序能绑定 IP
- 二进制 patch:绕过不存在的服务依赖
至此,Tenda AC15 的 httpd 已经成功在 x86 电脑上模拟运行。下一步可以进行动态调试、漏洞复现等深入分析。
本文完整代码和脚本已上传 GitHub:[链接]
dengchaohui/tenda-ac15-qemu-simulation: Tenda AC15 固件逆向分析(第二篇):QEMU 用户态模拟与 ConnectCfm 绕过实战
a5fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6V1k6h3&6Y4j5$3S2S2L8$3S2#2K9g2)9J5c8Y4c8W2L8X3c8S2i4K6u0V1j5h3x3I4y4g2)9J5k6s2q4W2L8i4g2Q4x3X3c8K6K9h3#2#2L8r3q4@1K9h3!0F1
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。