第二章:固件获取与解包
做固件逆向,第一步就是拿到固件。听起来简单,对吧?但这里面的门道可不少。我见过不少新手,固件下错了版本,折腾半天才发现问题。今天我们就从思科官网下载固件开始,一步步把核心文件系统给扒出来。
2.1 从思科官网下载固件
思科的固件下载其实挺规范的。你只需要去思科官网的支持页面,输入设备型号就行。我个人习惯用 Catalyst 2960 系列做演示,因为它的固件结构比较典型。
下载下来的固件通常是 .bin 文件。别被这个后缀骗了,它其实是个复合文件。里面包含了引导加载程序、操作系统内核、文件系统镜像等等。说白了,就是一个大杂烩。
2.2 使用 binwalk 解析固件
binwalk 是我们这行的瑞士军刀。它能自动识别固件里的各种文件头和签名。安装很简单,用 pip 或者 apt 都行。
# 安装 binwalk
sudo apt install binwalk
# 或者用 pip 安装最新版
pip install binwalk
# 解析固件
binwalk -Me c2960-lanbasek9-mz.150-2.SE.bin
这里 -M 参数是让 binwalk 自动提取识别到的文件,-e 是递归提取。跑完之后,你会看到一个 _c2960-lanbasek9-mz.150-2.SE.bin.extracted 目录。里面就是 binwalk 帮你扒出来的东西。
2.3 识别文件系统类型
解包出来的文件里,最重要的就是文件系统镜像。思科固件里最常见的两种文件系统是 SquashFS 和 JFFS2。怎么区分呢?
| 特征 | SquashFS | JFFS2 |
|---|---|---|
| 文件头签名 | hsqs (0x68737173) | 0x1985 (小端序) |
| 压缩方式 | gzip/lzma/lzo | zlib |
| 典型用途 | 只读根文件系统 | 可写文件系统(如配置分区) |
| 挂载方式 | loop 设备挂载 | mtd 设备挂载 |
你想想看,为什么思科要用两种不同的文件系统?其实很简单。SquashFS 是只读的,适合存放固件核心程序,防止被篡改。JFFS2 是可写的,用来存放配置文件和日志。这种设计在嵌入式设备里很常见。
2.4 提取核心文件系统
识别出文件系统类型后,提取就简单了。以 SquashFS 为例:
# 查看文件系统信息
unsquashfs -s squashfs.img
# 提取文件系统
unsquashfs -d extracted_rootfs squashfs.img
如果是 JFFS2,操作稍微复杂一点:
# 创建 mtd 块设备
modprobe mtdblock
modprobe jffs2
# 挂载 JFFS2 镜像
mount -t jffs2 jffs2.img /mnt/jffs2
# 或者用 jefferson 工具提取
jefferson -d extracted_jffs2 jffs2.img
嗯,这里要注意。JFFS2 是专门为 NAND Flash 设计的日志型文件系统。直接挂载可能会遇到坏块处理的问题。我建议优先用 jefferson 这个工具,它模拟了 Flash 的坏块管理,提取更可靠。
2.5 本章知识体系
下面这张图概括了固件获取与解包的完整流程:
2.6 避坑指南
做固件解包这么多年,我踩过的坑不少。分享几个最常见的:
- 版本不匹配:我曾经下载了一个 IOS 15.0 的固件,结果设备是 12.2 的硬件,解包后内核模块全都不兼容。所以下载前一定要核对设备型号和版本号。
- binwalk 识别失败:有些固件用了自定义的魔数签名。这时候别慌,用 hexdump 手动查看文件头,对照已知签名库去匹配。
- 文件系统损坏:下载过程中网络中断可能导致固件不完整。我习惯下载后用 MD5 校验一下,思科官网会提供校验值。
- 权限问题:提取出来的文件系统,有些文件的权限是 000。这是因为 SquashFS 里保存了原始权限。用 chmod 批量修复就行。
好了,到这一步,你已经成功拿到了固件的核心文件系统。接下来就可以开始真正的逆向分析了。记住,固件解包只是第一步,后面的路还长着呢。