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确认)。