1. IoT设备固件提取与文件系统识别

IoT设备固件提取与文件系统识别 学习卡片

固件镜像的层次结构与提取路径

拿到一个 IoT 设备固件镜像(常见为厂商官网下载的 .bin、.img 或从 Flash 读出的 dump 文件)后,第一步不是直接翻文件,而是先判断它的封装层次。典型固件从外到内依次是:厂商容器头 → 引导加载程序(U-Boot 等)→ 内核(zImage/uImage)→ 根文件系统(SquashFS/JFFS2/UBIFS/EXT4/cramfs)。只有剥到根文件系统层,才能看到真正的目录树和可分析文件。

下面这张图给出一个典型固件镜像的层次与对应提取动作,以及每层可用的识别命令:

固件镜像层次与提取路径 镜像内部层次(从外到内) ① 厂商容器头 / 签名区 magic、长度、CRC、RSA 签名 ② 引导加载程序 U-Boot u-boot.bin / u-boot.img ③ 内核镜像 zImage / uImage / Image ④ 设备树 DTB *.dtb(硬件描述) ⑤ 根文件系统(目标层) SquashFS / JFFS2 / UBIFS / EXT4 / cramfs 提取 识别命令与提取动作 binwalk firmware.bin 扫描 magic,列出各段偏移与类型 binwalk -e firmware.bin 自动提取,生成 _firmware.bin.extracted/ file rootfs.squashfs 确认文件系统类型(SquashFS filesystem…) unsquashfs -d rootfs/ rootfs.squashfs 解包 SquashFS 到 rootfs/ 目录 ls -la rootfs/ 得到 bin/ etc/ lib/ usr/ www/ 等根目录结构 关键判断点 • binwalk 输出中若出现 "Squashfs filesystem" 或 "JFFS2 filesystem",即为根文件系统段。 • 若 binwalk 无法自动提取,用 dd 按偏移手动切出:dd if=firmware.bin of=rootfs.squashfs bs=1 skip=<offset> • 提取后先看 /etc/passwd、/etc/init.d/、/usr/bin/,这些是后续凭据与组件分析的主要入口。

实操:从镜像到根目录结构

以下操作在 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 命令典型输出解包工具常见设备
SquashFSSquashfs filesystem, little endianunsquashfs路由器、摄像头
JFFS2JFFS2 filesystem, little endianjefferson / mtd-utils老式嵌入式设备
UBIFSUBI image / UBIFSubireader / ubi_readerNAND Flash 设备
EXT4Linux rev 1.0 ext4 filesystem datamount -o loop带 eMMC 的设备
cramfsLinux Compressed ROM File Systemcramfsck / 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 是否存在且可读。