3. 固件解包与文件系统提取

任务目标

本案例以典型嵌入式路由器固件为例,完成固件解包、文件系统提取与完整性验证的完整闭环。你将使用 binwalk 识别固件内部结构,使用 jefferson 解包 JFFS2 文件系统,最终通过关键文件比对验证提取结果正确。

环境准备

推荐使用 Ubuntu 22.04+,安装以下依赖:

sudo apt update
sudo apt install -y binwalk mtd-utils zlib1g-dev liblzma-dev
pip3 install jefferson

固件样本获取

从 binwalk 官方测试固件库 下载 tp-link-tl-wr841n-v8.bin(约 3.8MB),该文件包含 TRX 头部、内核镜像及 JFFS2 文件系统,适合本案例教学。

完整实现与操作步骤

步骤 1:固件结构扫描

binwalk tp-link-tl-wr841n-v8.bin

预期输出应显示三段关键信息:TRX 固件头(偏移 0)、Linux 内核镜像(偏移约 0x1F0000)、JFFS2 文件系统(偏移约 0x3A0000)。记录 JFFS2 的起始偏移地址,下一步将用到。

步骤 2:提取 JFFS2 分区

dd if=tp-link-tl-wr841n-v8.bin of=jffs2.img bs=1 skip=$((0x3A0000))

使用 dd 按步骤 1 中记录的偏移截取文件系统镜像。若你的固件扫描结果偏移不同,请以实际输出为准修改 skip 值。

步骤 3:使用 jefferson 解包文件系统

jefferson jffs2.img

jefferson 会在当前目录生成 jffs2-root/ 文件夹,内部即为提取出的完整文件系统目录树。

步骤 4:验证文件系统完整性

# 检查关键目录是否存在
ls jffs2-root/etc/ jffs2-root/usr/sbin/

# 验证关键文件类型(应为 ELF 可执行文件)
file jffs2-root/usr/sbin/httpd

# 校验文件系统内是否有明显损坏文件
find jffs2-root/ -type f -size 0 | head -5

验证方法与判定标准

检查项通过条件
binwalk 扫描识别出 TRX、内核、JFFS2 三段结构,且偏移地址合理
jefferson 解包命令无报错退出,生成 jffs2-root/ 目录
目录结构/etc、/usr/sbin 等标准 Linux 目录存在
文件类型httpd 等可执行文件被识别为 ELF 32-bit ARM 或 MIPS 格式(取决于固件架构)
空文件检查find 命令输出为空或仅少量正常空文件(如 /var 下的占位文件)

常见问题

  • jefferson 报错 No module named 'cstruct':执行 pip3 install cstruct 后重试。
  • binwalk 输出偏移与上述不同:不同固件版本布局不同,以实际扫描结果为准,dd 命令的 skip 值必须与 binwalk 输出严格一致。
  • 解包后文件系统为空:确认 dd 截取时 skip 值是否正确,可用 binwalk -e 自动提取交叉验证。

完成以上步骤并满足全部判定条件,即表示固件解包与文件系统提取成功。该流程可直接复用于其他基于 TRX + JFFS2 结构的嵌入式固件分析任务。