1. 搭建嵌入式固件Fuzzing实验环境

搭建嵌入式固件Fuzzing实验环境 学习卡片

任务目标

本案例完成嵌入式固件Fuzzing实验环境的最小可复现搭建:安装并验证QEMU系统仿真、AFL++编译器插桩工具链、binwalk固件解包工具,并创建一个可复现的固件分析工作目录结构。最终通过一个自编译的测试程序验证AFL++插桩与QEMU用户态仿真链路可用。

环境依赖

  • 操作系统:Ubuntu 22.04 LTS(x86_64)
  • 基础包:build-essential、git、python3、python3-pip、libtool、automake、autoconf、flex、<||DSML||>、libglib2.0-dev、libpixman-1-dev

工具安装与验证

以下命令按顺序执行,完成三个核心工具的安装。AFL++使用源码编译以确保插桩版本与QEMU模式兼容;QEMU使用apt源安装(版本≥6.2);binwalk通过pip安装(版本≥2.3)。

# 1. 安装系统依赖
sudo apt update
sudo apt install -y build-essential git python3 python3-pip libtool automake autoconf flex bison libglib2.0-dev libpixman-1-dev

# 2. 安装QEMU(含用户态与系统仿真)
sudo apt install -y qemu-system-arm qemu-user-static

# 3. 安装binwalk
sudo pip3 install binwalk

# 4. 编译安装AFL++(含QEMU模式支持)
git clone https://github.com/AFLplusplus/AFLplusplus.git
cd AFLplusplus
make distrib
sudo make install
cd ..

安装完成后,验证工具可用性:

qemu-arm --version | head -1
afl-fuzz -V 1 2>&1 | grep "AFL++"
binwalk --help | head -3

预期输出分别显示QEMU版本号、AFL++版本信息(含afl-fuzz版本号)以及binwalk的用法摘要。若三条命令均正常输出,则工具链安装成功。

创建可复现实验环境

建立标准目录结构,用于后续案例的固件存储、解包输出与Fuzzing工作区:

mkdir -p ~/firmware-lab/{firmwares,extracted,seeds,output}
cd ~/firmware-lab
echo "export FIRMWARE_LAB=~/firmware-lab" >> ~/.bashrc
source ~/.bashrc

AFL++与QEMU模式联动验证

编写一个最小ARM测试程序,验证AFL++的QEMU模式能够对非本机架构二进制执行插桩Fuzzing。这是后续对真实固件进行黑盒Fuzzing的基础。

// test_target.c
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc < 2) return 1;
    char buf[16];
    strcpy(buf, argv[1]);  // 故意不检查长度
    if (buf[0] == 'A' && buf[1] == 'B' && buf[2] == 'C') {
        printf("Vulnerability triggered!\n");
        __builtin_trap();  // 模拟崩溃
    }
    return 0;
}

编译为ARM架构可执行文件并运行Fuzzing验证:

# 使用ARM交叉编译器(若无则先安装:sudo apt install gcc-arm-linux-gnueabihf)
arm-linux-gnueabihf-gcc -static -o test_target test_target.c

# 创建种子输入
mkdir -p seeds
echo "AAAA" > seeds/seed1

# 使用AFL++ QEMU模式进行10秒Fuzzing验证
afl-fuzz -Q -i seeds -o output -V 10 -- ./test_target @@

验证判定标准:Fuzzing结束后,检查output/default/crashes/目录是否存在崩溃样本。若存在,说明AFL++成功通过QEMU模式对ARM二进制执行了插桩Fuzzing,并发现了由strcpy溢出触发的崩溃路径。预期崩溃样本内容以ABC开头。

常见问题排查

  • QEMU用户态无法执行ARM二进制:确认已安装qemu-user-static,且内核已启用binfmt_misc支持(ls /proc/sys/fs/binfmt_misc/应有qemu-arm注册项)。
  • AFL++ QEMU模式报错CPU does not support:在x86主机上运行ARM程序需确保qemu-arm-static在PATH中,且AFL++编译时make distrib已正确检测QEMU路径。
  • binwalk解包权限不足:部分固件格式需要root权限读取块设备,使用sudo binwalk -e firmware.bin即可。

至此,嵌入式固件Fuzzing实验环境搭建完成,所有工具已验证可用,且AFL++的QEMU模式已通过最小ARM程序的Fuzzing验证。后续案例将在此环境基础上进行真实固件分析。