3. 固件解包与文件系统提取
任务目标
给定一个包含JFFS2文件系统的路由器固件镜像,使用binwalk识别文件系统偏移,并通过jefferson工具解包提取内部文件(如配置文件、Web资源等),最终验证提取结果。
环境准备
安装所需工具(Ubuntu/Debian):
sudo apt update
sudo apt install -y binwalk mtd-utils
sudo pip3 install jefferson
固件样本
本案例使用一个模拟固件镜像 router_fw.bin,其结构为:头部填充数据 + JFFS2文件系统。生成该样本以便完整演示提取流程:
# 创建测试文件结构
mkdir -p rootfs/etc rootfs/www
echo "admin:admin123" > rootfs/etc/passwd
echo "<html>Router Admin</html>" > rootfs/www/index.html
# 制作JFFS2镜像(使用mkfs.jffs2,来自mtd-utils)
mkfs.jffs2 -d rootfs -o rootfs.jffs2 -e 0x10000
# 添加1KB随机头部模拟固件前缀
head -c 1024 /dev/urandom > router_fw.bin
cat rootfs.jffs2 >> router_fw.bin
完整实现与提取流程
以下命令完成从固件识别到文件提取的完整闭环:
# 1. 扫描固件中的文件系统签名
binwalk router_fw.bin
# 预期输出(关键行):
# DECIMAL HEXADECIMAL DESCRIPTION
# 1024 0x400 JFFS2 filesystem, little endian
# 2. 使用jefferson提取JFFS2内容(自动处理偏移)
jefferson router_fw.bin -d extracted_fs
# 3. 验证提取结果
find extracted_fs -type f | sort
cat extracted_fs/etc/passwd
验证方法与判定标准
执行以下检查,全部满足即判定提取成功:
binwalk输出中JFFS2偏移为0x400(即1024字节头部之后);jefferson命令退出码为0,且在extracted_fs/目录下生成文件;find命令能看到etc/passwd和www/index.html两个文件;cat extracted_fs/etc/passwd输出admin:admin123,与制作镜像时的内容一致。
常见问题
- binwalk未识别JFFS2:确认镜像确实包含JFFS2(可用
hexdump -C router_fw.bin | head查看0x400处是否以0x85 0x19开头);若固件为TRX或其他封装格式,需先用binwalk -e递归解包。 - jefferson报错“Unknown compression”:安装
python3-lzo依赖:sudo apt install python3-lzo。 - 提取后文件权限异常:jefferson默认以当前用户运行,若需保留原始权限,使用
sudo jefferson执行。
本案例使用合成固件演示完整流程;真实固件只需将router_fw.bin替换为目标镜像,binwalk偏移和jefferson提取步骤完全一致。若固件包含SquashFS而非JFFS2,改用binwalk -e或unsquashfs即可,识别与验证逻辑相同。