第一章:固件分析基础

各位同学好,我是老周。做嵌入式安全这块有些年头了,今天咱们聊聊固件分析的基础知识。说实话,很多人一上来就想着怎么解包、怎么逆向,结果连固件长什么样都没搞清楚——这路子走偏了。

我个人的习惯是,拿到一个路由器固件,先不急着动手拆。先看看它是什么架构、什么文件系统、怎么打包的。这就跟开锁一样,你得先知道锁芯的结构,再决定用哪把钥匙。

1.1 嵌入式系统概述

嵌入式系统,说白了就是专门干一件事的计算机系统。你家里的路由器、智能摄像头、甚至微波炉,里面都藏着这么个小电脑。

跟咱们用的PC不一样,嵌入式系统有几个特点:

  • 资源有限——内存可能就64MB,Flash存储也就16MB。我当年拆一个老款思科路由器,Flash才8MB,跑个完整Linux都费劲。
  • 专用性强——路由器就是干路由的,不会让你在上面打游戏。
  • 实时性要求高——数据包转发不能等,延迟高了用户就骂娘。
  • 固件固化——系统程序直接烧在Flash里,不像PC那样装硬盘上。

嗯,这里要注意一点:嵌入式系统的固件,本质上就是操作系统 + 应用程序 + 配置文件打包在一起的一个二进制文件。你把它解开了,就能看到里面的全部家当。

1.2 路由器固件结构

思科路由器的固件,我拆过不下50个型号。结构上大同小异,一般长这样:

典型路由器固件布局:

+------------------+
|   Bootloader     |  <-- 引导加载程序(如RedBoot、U-Boot)
+------------------+
|    Kernel        |  <-- Linux内核(压缩或未压缩)
+------------------+
|   RootFS         |  <-- 根文件系统(SquashFS/JFFS2等)
+------------------+
|   Config分区     |  <-- 配置文件(NVRAM或单独分区)
+------------------+
|   Web UI数据     |  <-- 管理界面HTML/CSS/JS
+------------------+

为什么这么布局?我跟你讲,这是有讲究的:

  • Bootloader在最前面,上电先跑它。它负责初始化硬件、加载内核。
  • Kernel是操作系统核心,负责管理硬件资源。
  • RootFS里放着所有用户态程序——HTTP服务器、命令行工具、网络协议栈等等。
  • Config分区保存你的配置,比如WiFi密码、路由表。这个分区是可读写的。

我曾经遇到过一个案例:某型号路由器固件升级后变砖了。拆开一看,原来是新固件的RootFS分区大小超过了Flash的物理容量,把配置分区给覆盖了。你说坑不坑?

1.3 常见文件系统类型

路由器固件里用的文件系统,跟PC上的NTFS、ext4不太一样。嵌入式环境有它自己的讲究。

SquashFS——只读压缩文件系统

SquashFS是我见过用得最多的。为什么?因为它只读、压缩率高、解压快

  • 只读意味着固件不会被篡改——安全性好。
  • 压缩率高——同样的Flash能装更多功能。
  • 解压快——路由器启动时不需要解压整个文件系统,按需解压就行。

我个人的习惯是,拿到一个固件先看它是不是SquashFS。怎么判断?用binwalk扫一下,看到"SquashFS filesystem"字样就对了。

小技巧:解压SquashFS用unsquashfs命令。但要注意,不同版本的SquashFS可能不兼容。我遇到过用新版本工具解压老版本固件失败的情况,后来换了对应版本才搞定。

JFFS2——日志结构文件系统

JFFS2是专门为Flash存储设计的。它有几个特点:

  • 支持读写——不像SquashFS只能读。
  • 磨损均衡——Flash有写入寿命,JFFS2会尽量均匀地写各个块。
  • 掉电保护——突然断电不会丢数据。

但JFFS2有个毛病:挂载慢。启动时要扫描整个Flash,建立文件索引。Flash越大,启动越慢。我记得有个项目,客户抱怨路由器启动要3分钟,查了半天发现是JFFS2在作怪。

UBIFS——下一代Flash文件系统

UBIFS是JFFS2的升级版,解决了JFFS2的一些痛点:

  • 挂载速度快——不需要全盘扫描。
  • 空间利用率高——压缩更高效。
  • 支持大容量Flash——JFFS2在几百MB的Flash上表现很差,UBIFS没问题。

现在新出的思科路由器,很多都用UBIFS了。但老设备还是SquashFS为主。

1.4 三种文件系统对比

特性 SquashFS JFFS2 UBIFS
读写性 只读 读写 读写
压缩 支持(gzip/lzma等) 支持 支持
挂载速度
磨损均衡 不需要(只读) 支持 支持
掉电保护 天然安全 支持 支持
典型用途 根文件系统 配置分区 数据分区

1.5 知识体系总览

下面这张图,是我自己总结的固件分析知识体系。你把它记住了,后面学起来就顺了。

固件分析知识体系 第一步:固件获取 官网下载 | 编程器读取 | 串口导出 | 网络抓包 第二步:固件识别 架构识别(MIPS/ARM/PowerPC) | 文件系统识别 | 压缩算法识别 第三步:文件系统处理 SquashFS(unsquashfs) | JFFS2(jefferson) | UBIFS(ubireader) 第四步:文件提取与分析 binwalk自动化提取 | 手动偏移提取 | 文件结构分析 第五步:安全分析 漏洞挖掘 | 后门检测 | 固件修改 | 逆向工程 本章重点

这张图把固件分析的流程串起来了。从获取固件开始,到识别结构、处理文件系统、提取文件,最后做安全分析。咱们这门课,就是沿着这条线一步步往下走。

避坑指南:我曾经在分析一个思科交换机固件时,直接用binwalk -e解包,结果解出来一堆乱码。后来才发现,这个固件用了自定义的头部格式,binwalk没识别出来。所以啊,工具不是万能的,你得理解底层原理,才能应对各种奇葩情况。

好了,第一章就讲这么多。记住三个关键词:SquashFS、JFFS2、UBIFS。后面咱们实操的时候,你会反复跟它们打交道。


专注资料整理