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查看熵值变化定位边界。
  • 实际固件包含加密或压缩层:本案例为明文拼接结构。真实固件可能整体加密或使用专有打包格式,需先识别外层封装。