从案例中学习 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 分析错误原因

  1. 使用IDA打开bin/boa
  2. 搜索字符串Initialize AP MIB failed!
  3. 定位到websAspInit()函数
  4. 发现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. 关键点总结

  1. 固件提取:使用Binwalk配合sasquatch解决压缩格式问题
  2. 函数劫持:通过LD_PRELOAD劫持关键函数绕过硬件检查
  3. 动态调试:使用QEMU+GDB配合IDA进行远程调试
  4. Web修复:修改重定向逻辑使Web界面可访问
  5. 依赖处理:确保所有必要的库文件在仿真环境中可用

这种方法可以推广到其他IoT设备的固件仿真分析中,特别是当设备有硬件依赖检查时,函数劫持是一个有效的解决方案。

IoT固件仿真教学:D-Link DIR-605L(FW_ 113)运行环境修复 1. 准备工作 1.1 获取目标固件 从D-Link官方技术支持网站下载DIR-605L(FW_ 113)固件: 解压后得到固件文件 dir605L_FW_113.bin 1.2 安装必要工具 Binwalk :用于固件分析提取 QEMU :用于固件仿真 交叉编译工具链 :用于MIPS架构编译 2. 固件提取 2.1 安装Binwalk 2.2 解决Capstone报错 如果遇到 AttributeError: module 'capstone' has no attribute 'CS_ARCH_ARM64' 错误: 2.3 安装sasquatch 2.4 提取文件系统 提取的文件系统位于 squashfs-root-0 目录 3. 固件仿真 3.1 初始运行尝试 通常会遇到 Initialize AP MIB failed! 错误 3.2 分析错误原因 使用IDA打开 bin/boa 搜索字符串 Initialize AP MIB failed! 定位到 websAspInit() 函数 发现 apmib_init() 函数返回false导致错误 3.3 函数劫持解决方案 创建劫持库 apmib.c : 编译劫持库: 3.4 解决依赖问题 复制必要的库文件: 3.5 调试运行 使用IDA远程调试(端口1234) 3.6 处理后续错误 调试发现 apmib_get() 和 fork() 也需要劫持,更新 apmib.c : 重新编译: 4. Web界面修复 4.1 修改first.asp 编辑 web/first.asp 文件,修改JavaScript部分: 5. 最终运行 成功运行后,可以通过浏览器访问设备的Web界面。 6. 关键点总结 固件提取 :使用Binwalk配合sasquatch解决压缩格式问题 函数劫持 :通过LD_ PRELOAD劫持关键函数绕过硬件检查 动态调试 :使用QEMU+GDB配合IDA进行远程调试 Web修复 :修改重定向逻辑使Web界面可访问 依赖处理 :确保所有必要的库文件在仿真环境中可用 这种方法可以推广到其他IoT设备的固件仿真分析中,特别是当设备有硬件依赖检查时,函数劫持是一个有效的解决方案。