第一章:固件分析基础
各位同学好,我是老周。做嵌入式安全这块有些年头了,今天咱们聊聊固件分析的基础知识。说实话,很多人一上来就想着怎么解包、怎么逆向,结果连固件长什么样都没搞清楚——这路子走偏了。
我个人的习惯是,拿到一个路由器固件,先不急着动手拆。先看看它是什么架构、什么文件系统、怎么打包的。这就跟开锁一样,你得先知道锁芯的结构,再决定用哪把钥匙。
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 知识体系总览
下面这张图,是我自己总结的固件分析知识体系。你把它记住了,后面学起来就顺了。
这张图把固件分析的流程串起来了。从获取固件开始,到识别结构、处理文件系统、提取文件,最后做安全分析。咱们这门课,就是沿着这条线一步步往下走。
避坑指南:我曾经在分析一个思科交换机固件时,直接用binwalk -e解包,结果解出来一堆乱码。后来才发现,这个固件用了自定义的头部格式,binwalk没识别出来。所以啊,工具不是万能的,你得理解底层原理,才能应对各种奇葩情况。
好了,第一章就讲这么多。记住三个关键词:SquashFS、JFFS2、UBIFS。后面咱们实操的时候,你会反复跟它们打交道。