1. IoT设备固件提取与文件系统识别
固件镜像的层次结构与提取路径
拿到一个 IoT 设备固件镜像(常见为厂商官网下载的 .bin、.img 或从 Flash 读出的 dump 文件)后,第一步不是直接翻文件,而是先判断它的封装层次。典型固件从外到内依次是:厂商容器头 → 引导加载程序(U-Boot 等)→ 内核(zImage/uImage)→ 根文件系统(SquashFS/JFFS2/UBIFS/EXT4/cramfs)。只有剥到根文件系统层,才能看到真正的目录树和可分析文件。
下面这张图给出一个典型固件镜像的层次与对应提取动作,以及每层可用的识别命令:
实操:从镜像到根目录结构
以下操作在 Linux 分析机(如 Ubuntu)上完成,工具为 binwalk 与 squashfs-tools。假设镜像文件名为 firmware.bin。
# 1. 安装工具(Debian/Ubuntu)
sudo apt-get install -y binwalk squashfs-tools
# 2. 扫描镜像,查看各段偏移与类型
binwalk firmware.bin
# 3. 自动提取(-e 提取,-M 递归扫描提取出的文件)
binwalk -e -M firmware.bin
# 4. 进入提取目录,确认根文件系统文件
cd _firmware.bin.extracted/
file *squashfs* # 确认类型
unsquashfs -d rootfs/ rootfs.squashfs # 解包
# 5. 查看根目录结构
ls -la rootfs/
若 binwalk 未能自动识别,可用 dd 按偏移手动切分。例如扫描输出显示 SquashFS 起始于偏移 0x1A0000:
dd if=firmware.bin of=rootfs.squashfs bs=1 skip=$((0x1A0000))
file rootfs.squashfs
unsquashfs -d rootfs/ rootfs.squashfs
结果判读与常见文件系统特征
| 文件系统 | file 命令典型输出 | 解包工具 | 常见设备 |
|---|---|---|---|
| SquashFS | Squashfs filesystem, little endian | unsquashfs | 路由器、摄像头 |
| JFFS2 | JFFS2 filesystem, little endian | jefferson / mtd-utils | 老式嵌入式设备 |
| UBIFS | UBI image / UBIFS | ubireader / ubi_reader | NAND Flash 设备 |
| EXT4 | Linux rev 1.0 ext4 filesystem data | mount -o loop | 带 eMMC 的设备 |
| cramfs | Linux Compressed ROM File System | cramfsck / binwalk | 低资源设备 |
验证提取是否完整:解包后检查
rootfs/etc/passwd、rootfs/etc/shadow、rootfs/bin/busybox 是否存在。若这些文件缺失,说明提取不完整或文件系统被裁剪,需要回到 binwalk 输出重新确认偏移。
注意:部分厂商固件在根文件系统外层加了加密或压缩(如 LZMA、AES),binwalk 可能只识别到压缩流而无法直接解出 SquashFS。此时需先解压/解密外层,再重复上述流程。不要跳过
file 确认步骤直接解包,否则容易得到乱码目录。
提取结果检查清单
- binwalk 输出中是否出现明确的文件系统类型标识(Squashfs / JFFS2 / UBIFS / ext4)。
- 提取目录中是否生成独立的根文件系统文件(如
rootfs.squashfs)。 file命令输出与 binwalk 判断是否一致。- 解包后根目录是否包含
bin/、etc/、lib/、usr/、www/等标准目录。 - 关键文件
etc/passwd、etc/init.d/rcS、bin/busybox是否存在且可读。