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_erasenandwrite模拟,但太麻烦了,我不建议。

打包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,注意对齐参数

最后说一句:解包只是开始。真正有意思的是解包之后——分析文件系统里的配置、找硬编码密码、挖漏洞。但那是后面章节的事了。先把包拆开,你才能看到里面的世界。