固件模拟指北

本文最后更新于:2023年12月28日 晚上

0x0:写在所有之前

固件模拟这个玩意笔者也不想多说什么,纯纯的折磨自己,但是还不得不搞(主要是实在是太穷没有米买设备)

最近把主流的固件模拟方法都过了一遍,于是笔者就想水篇博客顺带记点笔记。

鉴于固件模拟有各种薛定谔的报错,笔者使用的较为稳定的ubuntu20.04

🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡🤡

0x1:框架模拟

直接工具一把梭哈

FirmAE & Firmadyne

这两个没什么好说的,能不能模拟起来纯靠运气

笔者更倾向于FirmAE一点,主要是懒狗一条,能直接一行command完事的事情谁会想搓一个启动脚本呢

关于这两个框架的具体信息可以直接在github找

pr0v3rbs/FirmAE: Towards Large-Scale Emulation of IoT Firmware for Dynamic Analysis (github.com)

firmadyne/firmadyne: Platform for emulation and dynamic analysis of Linux-based firmware (github.com)

Fact_core

docker拉了两个小时没拉下来,捏麻麻滴,不做评价

0x2:Qemu模拟

有一说一虚拟化真的是个神奇的技术,笔者现在也对Virtualization逐渐起了兴趣

言归正传,qemu模拟有两个不同的模式,user模式和system模式,在本篇博客中,两种模式都会详细介绍

qemu user

patch

user模式下模拟较为便捷,这边就以典型的Tenda AC15来作为例子固件下载

先看一下架构(一般都是查看/bin/busybox),是arm,小端序,动态链接

且在/bin中存在httpd可执行文件,于是我们就可以尝试运行一下httpd

首先因为httpd是异架构的动态链接,所以模拟的时候最好直接用静态编译的qemu

先下载qemu-user-static

1
sudo apt-get install qemu-user-static

然后找到对应架构的qemu-user-static,复制到当前文件夹下

1
2
which qemu-arm-static
cp [path to qemu-arm-static] .``

将squashfs-root切换为根目录,user模式执行./bin/httpd

1
sudo chroot . ./qemu-arm-static ./bin/httpd

执行了,但没完全执行,但至少我们可以确定这样是有可行性的(yes,we love linux!!!)

img

把httpd拖进ida,根据相应得字符串,看一下是哪边卡住了

在那边下个断点,然后用IDA远程调式康康什么情况,GDB应该也行

img

单步步进,看到R0寄存器被赋值0,随后就只能跳转到0x2E514,所以使用keypatch来绕过这个这个检测

img

img

再执行看看会怎么样

又寄了,那就再动调一下

img

可有看到这边又有一个和刚才类似得patch,那就故技重施

img

img

再次执行,成功了,但没完全成功,255.255.255.255是给人访问的?那只能继续调了

img

可以看到我们前面的两处patch都是为了执行ConnectCfm,接下来便是一些变量的获取

GetLanIfName之后,猜测**GetValue(“lan.ip”, s);**便是导致ip不正常的罪魁祸首

那就查看一下外部调用GetLanIfName

GetLanIfName被定义在lib/libcommon.so中,外部调用了get_eth_name

img

外部调用函数get_eth_name被定义lib/libChipApi.so在中,具体function是获取网卡名称,但是本机中无法匹配与之相应的网卡

img

所以那就起一个名称为br0的网卡

1
2
sudo brctl addbr br0
sudo ifconfig br0 192.168.10.144/24

成功!!!

img

访问一下ip试试

草,访问失败,香槟开早了

img

那就只能在启动的时候加上–strace参数看看具体执行过程了

果然,在访问**/webroot/main.html**时发生了报错

img

仔细一看webroot这个文件夹是空的,而那些main.html文件全在文件夹webroot_ro中

img

那就只能把webroot给删了,然后创建一个软连接了

1
2
rm -rf webroot
sudo ln -s webroot_ro/ webroot

再访问一下,成功!!

img

hook

这个手法太超前了,等铸币笔者学成归来再说

qemu system

这时候就到了全系统模拟了

winmt👴的文章中有很详细的流程[原创] 从零开始复现 DIR-815 栈溢出漏洞-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com

王指导用的是ubuntu20,但我只有ubuntu16能成功起起来

文章中那个镜像的链接好像有点小问题,笔者这边贴一个images (sboc.dev),里面还有system模式启动脚本,真的我哭死

这边还是用Tenda AC15的固件作为示范

镜像起起来后,保证qemu里的ip能和外网ping通。

本地开一个http服务或者用scp把squashfs-root传输进去

使用命令挂载并切换根目录

img

接下来便是把patch好的httpd替换掉原本的

设置网卡了br0,但默认的busybox中不存在brctl指令,github上随便找个编译好的arm架构的busybox传进去就行

启动httpd

img


固件模拟指北
http://example.com/2023/07/30/Fuzz1/
作者
korey0sh1
发布于
2023年7月30日
许可协议