4. 固件打包与重打包

任务说明

本案例以典型嵌入式设备固件(基于D-Link DIR-850L的固件结构为参考模型)为对象,完成一次完整的固件解包→修改→重打包流程。最终目标不是生成可刷机的官方固件,而是得到一个结构完整、可被仿真器(如QEMU)加载启动的根文件系统镜像,并验证修改已生效。

环境与依赖

  • 操作系统:Ubuntu 20.04+(x86_64)
  • 工具:binwalk、squashfs-tools、qemu-user-static、file、hexdump
  • 安装命令:sudo apt install binwalk squashfs-tools qemu-user-static

固件获取与解包

从D-Link官方支持页面下载DIR-850L固件(如DIR850L_REVB_FW207WWb05.bin),或使用任意已知结构的嵌入式Linux固件。以下操作以该固件为例:

# 1. 查看固件结构
binwalk DIR850L_REVB_FW207WWb05.bin

# 2. 提取固件内容(自动识别并解出文件系统)
binwalk -e DIR850L_REVB_FW207WWb05.bin
cd _DIR850L_REVB_FW207WWb05.bin.extracted/

# 3. 确认文件系统类型(通常为SquashFS)
file squashfs-root 2>/dev/null || file *.squashfs

若binwalk未能自动解出SquashFS,手动定位偏移并解包:

# 查找SquashFS偏移(示例偏移为0x2A0000,实际以binwalk输出为准)
binwalk DIR850L_REVB_FW207WWb05.bin | grep "Squashfs"
dd if=../DIR850L_REVB_FW207WWb05.bin of=rootfs.squashfs bs=1 skip=$((0x2A0000))
unsquashfs rootfs.squashfs

修改文件系统

在解包出的squashfs-root目录中,修改/etc/init.d/rcS,在启动脚本末尾追加一条自定义标记,便于后续验证重打包是否成功:

echo "[fuzz-case4] repacked-fs-marker" >> squashfs-root/etc/init.d/rcS

同时可修改/etc/issue文件内容,增加一行版本标识:

echo "REPACKED_BY_CASE4" >> squashfs-root/etc/issue

重打包固件

# 1. 重新打包SquashFS(需与原始文件系统参数一致)
mksquashfs squashfs-root new_rootfs.squashfs \
  -comp xz -b 131072 \
  -no-xattrs -noappend

# 2. 查看原始固件头部信息(用于拼接)
binwalk DIR850L_REVB_FW207WWb05.bin | head -20

# 3. 提取固件头部(跳过文件系统部分,通常为前0x2A0000字节)
dd if=DIR850L_REVB_FW207WWb05.bin of=fw_header.bin bs=1 count=$((0x2A0000))

# 4. 拼接新固件
cat fw_header.bin new_rootfs.squashfs > repacked_fw.bin
chmod +x repacked_fw.bin

注意:若原始固件头部包含校验和(如D-Link通常在尾部附加校验),需先去除尾部校验字节再拼接。使用binwalk输出确认固件总长度与文件系统偏移,确保头部长度正确。

验证重打包结果

由于真实硬件刷机风险高,本案例采用QEMU用户态模拟验证文件系统可启动性:

# 1. 确认架构(通常为MIPS或ARM)
file squashfs-root/bin/busybox

# 2. 使用qemu-user模拟执行关键二进制(以MIPS大端为例)
sudo qemu-mips-static -L squashfs-root squashfs-root/bin/busybox ls /etc/issue

# 3. 预期输出应包含我们添加的标记行
# 输出示例(非实测):
# REPACKED_BY_CASE4
# (实际输出取决于固件原始内容)

更完整的启动验证可尝试使用chroot配合qemu-user-static执行/etc/init.d/rcS,但需注意部分固件脚本依赖硬件设备节点,可能无法完全执行。本案例以文件系统可挂载、关键二进制可执行为通过标准。

通过条件

  • unsquashfs -s new_rootfs.squashfs能正确显示文件系统信息,无报错;
  • 重新打包后的repacked_fw.bin可被binwalk识别出SquashFS文件系统;
  • 通过QEMU模拟执行busybox cat /etc/issue能输出包含REPACKED_BY_CASE4的内容,证明修改已生效且文件系统结构完整。

常见问题

  • mksquashfs参数不匹配:需使用unsquashfs -s查看原始压缩算法和块大小,保持重打包参数一致,否则设备内核可能无法挂载。
  • 头部长度错误:若拼接后binwalk无法识别,说明头部偏移不正确,重新用binwalk确认文件系统起始偏移。
  • QEMU执行段错误:多为动态链接库路径问题,确保使用-L指向解包出的根目录,且架构匹配(用file确认)。