第二章:固件获取与解包

做固件逆向,第一步就是拿到固件。听起来简单,对吧?但这里面的门道可不少。我见过不少新手,固件下错了版本,折腾半天才发现问题。今天我们就从思科官网下载固件开始,一步步把核心文件系统给扒出来。

2.1 从思科官网下载固件

思科的固件下载其实挺规范的。你只需要去思科官网的支持页面,输入设备型号就行。我个人习惯用 Catalyst 2960 系列做演示,因为它的固件结构比较典型。

小提示:下载前一定要确认设备的硬件版本和当前运行的 IOS 版本。我曾经遇到过一位学员,下载了不匹配的固件,结果解包后文件系统根本挂不上,白白浪费了半天时间。

下载下来的固件通常是 .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 帮你扒出来的东西。

核心要点:binwalk 的识别能力依赖于它的签名库。如果遇到加密或混淆的固件,binwalk 可能就无能为力了。这时候就需要手动分析,我们后面章节会讲到。

2.3 识别文件系统类型

解包出来的文件里,最重要的就是文件系统镜像。思科固件里最常见的两种文件系统是 SquashFS 和 JFFS2。怎么区分呢?

特征 SquashFS JFFS2
文件头签名 hsqs (0x68737173) 0x1985 (小端序)
压缩方式 gzip/lzma/lzo zlib
典型用途 只读根文件系统 可写文件系统(如配置分区)
挂载方式 loop 设备挂载 mtd 设备挂载

你想想看,为什么思科要用两种不同的文件系统?其实很简单。SquashFS 是只读的,适合存放固件核心程序,防止被篡改。JFFS2 是可写的,用来存放配置文件和日志。这种设计在嵌入式设备里很常见。

注意:有些固件会使用自定义的文件系统签名。比如思科某些高端交换机,会在标准 SquashFS 前面加一段自定义头部。这时候 binwalk 可能识别不出来,需要手动用 hexdump 查看。

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 本章知识体系

下面这张图概括了固件获取与解包的完整流程:

固件获取与解包流程 步骤1:下载固件 思科官网 → .bin文件 步骤2:binwalk解析 自动识别文件头和签名 步骤3:识别文件系统 SquashFS / JFFS2 判断类型 SquashFS 提取 unsquashfs 工具 JFFS2 提取 jefferson 工具 步骤4:提取核心文件系统 得到完整的目录结构和文件 最终成果:核心文件系统目录 /bin /sbin /etc /usr /lib ...

2.6 避坑指南

做固件解包这么多年,我踩过的坑不少。分享几个最常见的:

  • 版本不匹配:我曾经下载了一个 IOS 15.0 的固件,结果设备是 12.2 的硬件,解包后内核模块全都不兼容。所以下载前一定要核对设备型号和版本号。
  • binwalk 识别失败:有些固件用了自定义的魔数签名。这时候别慌,用 hexdump 手动查看文件头,对照已知签名库去匹配。
  • 文件系统损坏:下载过程中网络中断可能导致固件不完整。我习惯下载后用 MD5 校验一下,思科官网会提供校验值。
  • 权限问题:提取出来的文件系统,有些文件的权限是 000。这是因为 SquashFS 里保存了原始权限。用 chmod 批量修复就行。
我的习惯:每次解包后,我都会先看看 /etc/passwd 和 /etc/shadow 文件。这两个文件能告诉我很多信息,比如设备默认的用户名、密码哈希算法等。有时候还能找到硬编码的后门账号。

好了,到这一步,你已经成功拿到了固件的核心文件系统。接下来就可以开始真正的逆向分析了。记住,固件解包只是第一步,后面的路还长着呢。


专注资料整理