3. 固件提取与解包:硬件提取方法与软件解包工具
固件安全测试的第一步,也是最关键的一步——拿到固件。你可能会想,固件不就在芯片里吗?直接读出来不就行了?嗯,事情没那么简单。我见过太多团队卡在这一步,拿着昂贵的设备却读不出数据,或者读出来了却解不开包。
这一章,我们聊聊怎么把固件从硬件里“请”出来,以及怎么把它拆开看个明白。
3.1 硬件提取方法:从物理层面下手
硬件提取,说白了就是直接和芯片打交道。你想想看,如果设备连串口都没开,网络也封死了,那唯一的入口就是芯片本身。我个人习惯,先看芯片型号,再决定用哪种方式。
3.1.1 SPI Flash 提取:最常用的方法
大多数嵌入式设备都用 SPI Flash 存固件。这种芯片通常有 8 个脚,用夹子夹住就能读。我建议你备一套 SOP8/SOP16 的烧录夹,便宜又好用。
操作步骤其实不复杂:
- 识别芯片型号——看丝印,比如 Winbond 25Q128、MXIC 25L25635F。
- 连接编程器——用夹子夹住芯片,注意方向。我吃过亏,夹反了直接烧了芯片。
- 读取数据——用软件(如 FlashROM、SPIway)读全片数据。
- 校验——读两次,比对 MD5,确保数据完整。
关键点:SPI Flash 读取速度通常 1-10 MB/s,一个 16MB 的芯片大概 2-3 分钟读完。别急,慢慢来。
我的经验:有些设备会开启写保护或加密。我曾经遇到一个路由器,读出来的数据全是 0xFF。后来发现是芯片的 WP# 脚被拉高了,需要先接地才能正常读取。
3.1.2 JTAG/SWD 提取:更高级的玩法
如果 SPI Flash 被加密或者固件不在外部 Flash 里,那就得用 JTAG 或 SWD 了。JTAG 是调试接口,能直接访问 CPU 和内存。说白了,就是绕过所有软件保护,直接从硬件层面拿数据。
JTAG 提取的典型流程:
- 找接口——看 PCB 上有没有 4-20 脚的排针,通常标有 TMS、TCK、TDI、TDO。
- 接调试器——J-Link、OpenOCD 都行。我习惯用 J-Link,稳定。
- 扫描 JTAG 链——用
jtag scan命令确认连接。 - 读取内存——通过调试器 dump 出 Flash 或 RAM 内容。
注意:JTAG 提取需要设备上电。有些设备会检测调试器并自动复位,这时候需要加电容或电阻来“欺骗”它。我曾经在某个工控设备上折腾了三天,最后发现是 JTAG 引脚被复用成了 GPIO,需要先拉高才能激活。
3.2 软件解包工具:把固件拆开
拿到固件文件后,它通常是一个二进制大块。直接看?那是天书。我们需要把它拆成文件系统、内核、配置分区等。这里有两个工具我几乎天天用。
3.2.1 Binwalk:固件分析的瑞士军刀
Binwalk 是我最常用的工具。它能自动识别固件里的文件系统、压缩包、内核镜像。用法很简单:
# 扫描固件中的文件签名
binwalk firmware.bin
# 提取所有识别到的文件
binwalk -e firmware.bin
# 递归提取(处理嵌套压缩)
binwalk -Me firmware.bin
为什么 Binwalk 这么强?因为它内置了上千种文件签名。你想想看,一个固件里可能有 SquashFS、JFFS2、LZMA、gzip……Binwalk 能一个个把它们找出来。
避坑指南:我曾经遇到一个固件,Binwalk 扫描出来全是乱码。后来发现是固件头部有自定义校验,需要先跳过前 64 字节。用 binwalk -R 指定偏移量就能解决。
3.2.2 Firmware-mod-kit:解包与重打包
Firmware-mod-kit(FMK)是另一个神器。它专门针对嵌入式固件,能解包、修改、再打包。我建议你两个工具配合使用:Binwalk 负责扫描和初步提取,FMK 负责深度解包和重打包。
FMK 的典型用法:
# 解包固件
./extract-firmware.sh firmware.bin
# 修改文件系统后,重打包
./build-firmware.sh firmware/ firmware-new.bin
FMK 支持的文件系统类型:
| 文件系统 | 常见设备 | FMK 支持 |
|---|---|---|
| SquashFS | 路由器、摄像头 | ✅ 完整支持 |
| JFFS2 | 工业设备 | ✅ 支持 |
| CramFS | 老旧设备 | ✅ 支持 |
| UBIFS | 高端设备 | ⚠️ 部分支持 |
3.3 实战流程:从芯片到文件系统
我把整个流程画了一张图,方便你理解:
3.4 常见问题与避坑
做固件提取这么多年,我踩过的坑不少。挑几个典型的说说:
- 读出来的数据全是 0xFF 或 0x00——大概率是芯片没选对型号,或者引脚接触不良。重新夹一次试试。
- Binwalk 扫描结果为空——固件可能被加密或压缩了。试试
binwalk -E看熵值,如果熵值接近 1.0,说明是加密数据。 - FMK 解包失败——文件系统可能被修改过。我遇到过厂商把 SquashFS 的魔数改了,需要手动修复。
- JTAG 连接不上——检查电压是否匹配。3.3V 的设备用 5V 的调试器会烧芯片。
重要提醒:硬件提取有风险。我曾经在某个设备上因为夹子没夹稳,导致芯片引脚短路,直接冒烟了。所以,操作前一定要断电,检查连接,确认无误再上电。
好了,这一章的内容就这些。拿到固件并解包后,下一步就是分析文件系统、找漏洞了。记住,工具只是手段,理解原理才是关键。多动手,多踩坑,慢慢就有感觉了。