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 结构的嵌入式固件分析任务。