4、固件解包与打包:Binwalk工具使用、SquashFS文件系统解包、CramFS与JFFS2处理
拿到一个固件,第一件事是什么?
不是直接扔IDA里逆向,也不是上调试器。我个人习惯,先看看它能不能被拆开。说白了,固件就是个打包好的大箱子,里面装着文件系统、内核、引导程序。不解包,你什么都看不到。
4.1 Binwalk:固件分析的瑞士军刀
Binwalk是我用得最多的工具,没有之一。它干的事很简单——扫描固件里的文件签名。比如你看到一个.bin文件,不知道里面是什么,跑一下Binwalk就清楚了。
基本用法:
binwalk firmware.bin
输出会告诉你:
- 偏移地址(从哪里开始)
- 文件类型(SquashFS、CramFS、JFFS2、LZMA压缩等)
- 文件大小
我记得有一次分析某款路由器固件,Binwalk扫出来一堆东西,但有个分区死活识别不了。后来手动加了签名规则才搞定。嗯,这里要注意——Binwalk的签名库不是万能的,遇到未知格式你得自己补。
binwalk -Me firmware.bin 可以自动解包所有已知格式。但别太依赖它,有时候解出来的文件系统是坏的。
4.2 SquashFS:最常见的嵌入式文件系统
SquashFS在嵌入式设备里太常见了。它是个只读压缩文件系统,Linux内核原生支持。你想想看,路由器、摄像头、智能家居设备,十有八九都用它。
解包SquashFS,我推荐用unsquashfs:
unsquashfs rootfs.squashfs
它会自动解压到当前目录的squashfs-root文件夹里。如果遇到解不开的情况,八成是版本问题。SquashFS有v3、v4之分,有些老设备用v3,新工具默认只支持v4。
我曾经在分析一台工控设备时,unsquashfs报错说"Unknown filesystem version"。折腾了半天,发现是v3.0的旧格式。后来用squashfs-tools的旧版本才搞定。
打包回去呢?用mksquashfs:
mksquashfs squashfs-root/ new_rootfs.squashfs -comp xz
这里有个坑——压缩算法要选对。原固件用gzip,你改成xz,设备可能不认。我建议先查一下原固件的压缩方式:
binwalk -Me rootfs.squashfs | grep SquashFS
/bin、/sbin下的可执行文件,必须保持755。
4.3 CramFS:老牌但还在用
CramFS比SquashFS更老,但有些老设备还在用。它也是只读压缩文件系统,不过压缩率低一些,最大支持256MB文件系统。
解包CramFS用cramfsck:
cramfsck -x output_dir/ rootfs.cramfs
打包用mkcramfs:
mkcramfs source_dir/ new_rootfs.cramfs
我个人觉得CramFS现在用得少了,但如果你碰到2000年代的老设备,比如某些工业控制器,它还在。我记得有一次分析一台2005年的PLC,固件就是CramFS。当时找工具找了好久,因为现代Linux发行版默认不装cramfs-tools了。
这里有个对比表,方便你快速区分:
| 文件系统 | 压缩率 | 最大大小 | 常见设备 |
|---|---|---|---|
| SquashFS | 高(支持xz/gzip/lzo) | 16TB | 路由器、摄像头、IoT |
| CramFS | 中(仅gzip) | 256MB | 老工控、旧嵌入式设备 |
| JFFS2 | 中(支持zlib) | 取决于Flash | 老式路由器、嵌入式Linux |
4.4 JFFS2:Flash上的日志型文件系统
JFFS2是专门为NAND/NOR Flash设计的。它支持磨损均衡和掉电恢复,所以很多老设备用它做根文件系统。
解包JFFS2稍微麻烦点。你不能直接用mount,因为它是针对Flash的。我推荐用jefferson这个工具:
jefferson rootfs.jffs2
它会自动解包到rootfs.jffs2.extracted目录。如果没装jefferson,也可以用flash_erase和nandwrite模拟,但太麻烦了,我不建议。
打包JFFS2用mkfs.jffs2:
mkfs.jffs2 -r source_dir/ -o new_rootfs.jffs2 --pad=0x100000
这里--pad参数很关键。它指定了文件系统的对齐大小,必须和原固件一致。我曾经因为没对齐,刷进去设备启动到一半就挂了。嗯,这个坑我踩过两次,后来学乖了,每次先看原固件的分区表。
- Binwalk是第一步,但不是万能的
- SquashFS用unsquashfs/mksquashfs,注意版本和压缩算法
- CramFS用cramfsck/mkcramfs,主要对付老设备
- JFFS2用jefferson/mkfs.jffs2,注意对齐参数
最后说一句:解包只是开始。真正有意思的是解包之后——分析文件系统里的配置、找硬编码密码、挖漏洞。但那是后面章节的事了。先把包拆开,你才能看到里面的世界。