从案例中学习 IoT 固件仿真——D-Link DIR-605L(FW_113) 运行环境修复
字数 975 2025-08-22 12:23:30
IoT固件仿真教学:D-Link DIR-605L(FW_113)运行环境修复
1. 准备工作
1.1 获取目标固件
从D-Link官方技术支持网站下载DIR-605L(FW_113)固件:
https://support.dlink.com/resource/products/dir-605l/REVA/DIR-605L_FIRMWARE_1.13.ZIP
解压后得到固件文件dir605L_FW_113.bin
1.2 安装必要工具
- Binwalk:用于固件分析提取
- QEMU:用于固件仿真
- 交叉编译工具链:用于MIPS架构编译
2. 固件提取
2.1 安装Binwalk
# 下载Binwalk
wget https://github.com/ReFirmLabs/binwalk/archive/refs/tags/v2.3.4.zip
unzip v2.3.4.zip
cd binwalk-2.3.4
# 安装
sudo python3 setup.py install
# 验证安装
binwalk -h
2.2 解决Capstone报错
如果遇到AttributeError: module 'capstone' has no attribute 'CS_ARCH_ARM64'错误:
sudo pip3 uninstall capstone
sudo pip3 install capstone
2.3 安装sasquatch
git clone --depth 1 https://github.com/devttys0/sasquatch
cd sasquatch
wget https://github.com/devttys0/sasquatch/pull/51.patch
patch -p1 < 51.patch
sudo ./build.sh
2.4 提取文件系统
binwalk -Me dir605L_FW_113.bin
提取的文件系统位于squashfs-root-0目录
3. 固件仿真
3.1 初始运行尝试
apt-get install qemu binfmt-support qemu-user-static
cp $(which qemu-mips) ./
sudo chroot ./ qemu-mips ./bin/boa
通常会遇到Initialize AP MIB failed!错误
3.2 分析错误原因
- 使用IDA打开
bin/boa - 搜索字符串
Initialize AP MIB failed! - 定位到
websAspInit()函数 - 发现
apmib_init()函数返回false导致错误
3.3 函数劫持解决方案
创建劫持库apmib.c:
#include <stdio.h>
#include <stdlib.h>
int apmib_init(void) {
// 伪造返回成功
return 1;
}
编译劫持库:
sudo apt install gcc-mips-linux-gnu
mips-linux-gnu-gcc ./apmib.c -o apmib-ld.so -fPIC -shared
3.4 解决依赖问题
复制必要的库文件:
cp /usr/lib/i386-linux-gnu/libgcc_s.so.1 ./squashfs-root-0/lib/
3.5 调试运行
sudo chroot ./ ./qemu-mips-static -E LD_PRELOAD="/apmib-ld.so" -g 1234 ./bin/boa
使用IDA远程调试(端口1234)
3.6 处理后续错误
调试发现apmib_get()和fork()也需要劫持,更新apmib.c:
#include <stdio.h>
#include <stdlib.h>
#define MIB_IP_ADDR 170
#define MIB_HW_VER 0x250
#define MIB_CAPTCHA 0x2C1
int apmib_init() {
return 1;
}
int fork(void) {
return 0;
}
void apmib_get(int code, int *value) {
switch(code) {
case MIB_HW_VER:
*value = 0xF1;
break;
case MIB_IP_ADDR:
*value = 0x7F000001;
break;
case MIB_CAPTCHA:
*value = 1;
break;
}
return;
}
重新编译:
mips-linux-gnu-gcc ./apmib.c -o apmib-ld.so -fPIC -shared
4. Web界面修复
4.1 修改first.asp
编辑web/first.asp文件,修改JavaScript部分:
function init() {
var ecflag = <% getIndexInfo("enableecflag") %>;
if(ecflag == 0) {
if((LangCode == "SC")||(LangCode == "TW")) {
self.location.href="Basic/Wizard_Easy_Welcome.asp";
} else {
// self.location.href="Basic/Wizard_Easy_LangSelect.asp";
self.location.href="Basic/Wizard_Easy_Welcome.asp";
}
} else {
self.location.href="index.asp";
}
}
5. 最终运行
sudo chroot ./ ./qemu-mips-static -E LD_PRELOAD="/apmib-ld.so" ./bin/boa
成功运行后,可以通过浏览器访问设备的Web界面。
6. 关键点总结
- 固件提取:使用Binwalk配合sasquatch解决压缩格式问题
- 函数劫持:通过LD_PRELOAD劫持关键函数绕过硬件检查
- 动态调试:使用QEMU+GDB配合IDA进行远程调试
- Web修复:修改重定向逻辑使Web界面可访问
- 依赖处理:确保所有必要的库文件在仿真环境中可用
这种方法可以推广到其他IoT设备的固件仿真分析中,特别是当设备有硬件依赖检查时,函数劫持是一个有效的解决方案。