1. 固件镜像结构分析
任务目标
对一个固件镜像文件执行结构分析,识别其中包含的引导加载程序(Bootloader)、Linux内核(Kernel)与文件系统(Filesystem)的偏移位置与类型。本案例使用一个合成的演示固件作为分析对象,该固件由U-Boot镜像、Linux内核镜像与SquashFS文件系统拼接而成。
环境准备
需要一台Linux主机(或WSL),安装以下工具:
sudo apt-get update
sudo apt-get install -y binwalk u-boot-tools squashfs-tools
生成演示固件
为便于复现,先构造一个包含典型组件的固件文件。实际分析场景中,此步骤对应从设备中提取或下载得到的固件。
# 1. 制作一个最小U-Boot镜像(仅头部+填充)
mkimage -A arm -O linux -T firmware -C none -a 0x10000000 -e 0x10000000 -n "demo_boot" -d /dev/null uboot.img
# 2. 制作一个最小内核镜像(填充数据)
dd if=/dev/urandom of=kernel.bin bs=1K count=64
# 3. 制作一个最小SquashFS文件系统
mkdir -p rootfs/etc && echo "demo" > rootfs/etc/demo.conf
mksquashfs rootfs rootfs.squashfs -noappend -comp xz
# 4. 拼接为最终固件
cat uboot.img kernel.bin rootfs.squashfs > demo_firmware.bin
ls -lh demo_firmware.bin
固件结构分析
使用binwalk扫描固件中的文件签名与结构特征:
binwalk demo_firmware.bin
预期输出(偏移量可能因填充大小略有差异):
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 U-Boot header, header size: 64 bytes
64 0x40 U-Boot image, image size: 0
64 0x40 gzip compressed data
65664 0x10080 Linux kernel ARM boot executable zImage
131136 0x20040 SquashFS filesystem, little endian, version 4.0, compression:xz, size: 2048 bytes
关键偏移验证
binwalk的扫描结果给出了三个关键组件的起始偏移。为进一步确认文件系统边界,使用dd从固件中提取SquashFS部分并尝试挂载:
# 从偏移131136(0x20040)处提取文件系统
dd if=demo_firmware.bin of=extracted.squashfs bs=1 skip=131136
# 验证提取结果
file extracted.squashfs
# 挂载验证(需要root)
mkdir -p /mnt/squash_test
sudo mount -t squashfs extracted.squashfs /mnt/squash_test
ls /mnt/squash_test/etc/
sudo umount /mnt/squash_test
若挂载成功且能看到demo.conf文件,则证明偏移识别正确,文件系统可正常解析。
判定标准
- binwalk输出中能明确看到U-Boot头、Linux内核镜像与SquashFS文件系统三个条目,且偏移量依次递增。
- 使用
dd按binwalk给出的偏移提取文件系统后,file命令能识别为SquashFS文件系统。 - 提取的文件系统可以成功挂载并读取到内部文件,证明偏移定位准确。
常见问题
- binwalk输出大量误报:固件中随机填充数据可能触发虚假签名。优先关注结构完整、大小合理的条目,或使用
binwalk -A进行熵分析辅助判断。 - 文件系统无法挂载:确认提取偏移是否精确到文件系统头部(而非前一个组件的尾部),必要时使用
binwalk -E查看熵值变化定位边界。 - 实际固件包含加密或压缩层:本案例为明文拼接结构。真实固件可能整体加密或使用专有打包格式,需先识别外层封装。