首页
社区
课程
招聘
[原创]看雪QEMU 用户态模拟与 ConnectCfm 绕过实战
发表于: 1天前 213

[原创]看雪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)

  1. 右键点击指令 → Patch Program → Change Instruction
  2. 输入 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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回