3、固件获取与提取:从芯片读取固件(JTAG/SWD)、拆解设备获取Flash、固件镜像格式识别(bin/hex/elf)、固件加密与绕过思路
固件获取是嵌入式安全测试的起点,也是决定后续分析深度与效率的关键环节。在实际渗透与漏洞挖掘项目中,测试人员往往面临三种典型场景:设备具备调试接口(JTAG/SWD)可直读、设备需拆解后通过编程器离线读取Flash、设备固件经过加密或签名保护需先绕过防护。本章将系统讲解从硬件接口读取、芯片拆解、镜像格式识别到加密绕过思路的完整技术链路,帮助读者建立一套可复用的固件提取方法论。
3.1 从芯片读取固件:JTAG/SWD 调试接口技术
核心原理
JTAG(Joint Test Action Group,IEEE 1149.1)和 SWD(Serial Wire Debug)是嵌入式系统中最常用的调试接口。JTAG 通过 TMS、TCK、TDI、TDO 四根信号线实现边界扫描与调试访问,支持菊花链拓扑;SWD 则是 ARM 公司推出的两线制调试协议(SWDIO/SWCLK),在引脚占用和速度上优于 JTAG。两者均允许调试器直接访问 CPU 内核寄存器、内存映射和外设,从而读取片上 Flash 或外部 Flash 中的固件内容。
从安全测试角度看,JTAG/SWD 接口的价值在于:无需拆焊芯片,通过飞线或探针连接调试接口即可读取固件;同时可暂停 CPU 执行、修改内存数据,为动态调试和漏洞利用提供入口。但多数量产设备会禁用调试接口或设置访问权限,因此需要结合硬件逆向手段恢复访问。
判断方法与操作流程
判断设备是否开放 JTAG/SWD 接口,可从 PCB 上寻找测试点(Test Pad)或排针。常见标识包括:JTAG、SWD、DEBUG、TMS/TCK/TDI/TDO 等丝印。若没有明确标识,可通过万用表测量引脚间电阻或使用 JTAGulator 等工具自动识别。
| 接口类型 | 信号线 | 电压范围 | 典型速率 | 适用场景 |
|---|---|---|---|---|
| JTAG | TMS, TCK, TDI, TDO, (TRST) | 1.8V - 5V | 10-50 MHz | 复杂芯片、多核调试 |
| SWD | SWDIO, SWCLK | 1.2V - 3.3V | 最高 50 MHz | ARM Cortex-M 系列 |
| cJTAG | TCK, TMS(复用) | 1.8V - 3.3V | 10-30 MHz | 引脚受限的 IoT 模块 |
操作流程如下:
- 识别接口:使用 JTAGulator 或逻辑分析仪扫描 PCB 上的测试点,识别信号线定义。
- 连接调试器:将 J-Link、ST-Link 或 OpenOCD 支持的调试器与目标板连接,注意电平匹配(1.8V/3.3V)。
- 枚举设备:执行
openocd -f interface/jlink.cfg -f target/stm32f4x.cfg等命令,确认调试器能识别芯片。 - 读取固件:使用
flash read_bank 0 firmware.bin 0 0x100000或dump_image命令导出 Flash 内容。
案例拆解:某智能摄像头固件提取
某品牌智能摄像头采用海思 Hi3518EV300 主控,PCB 上预留了 4 针调试接口但未标注丝印。测试团队使用 JTAGulator 扫描发现 TMS/TCK/TDI/TDO 信号,连接 J-Link 后通过 OpenOCD 识别出 ARM926EJ-S 内核。由于芯片未设置读保护,直接执行 dump_image 导出 16MB SPI NOR Flash 内容,成功获取完整固件。整个过程耗时约 20 分钟,无需拆焊芯片。
常见误区与复盘
- 误区一:所有设备都支持 JTAG/SWD。部分芯片出厂即熔断调试接口,或仅支持专有调试协议(如 NXP 的 SWD 变种)。
- 误区二:忽略电平转换。1.8V 逻辑电平直接连接 3.3V 调试器可能导致信号失真或芯片损坏。
- 误区三:未检查读保护。即使能连接调试器,若 RDP 等级为 1 或 2,读取 Flash 会返回全 0xFF 或触发硬件错误。
3.2 拆解设备获取 Flash:离线读取技术
核心原理
当调试接口不可用或已被禁用时,拆解设备并直接读取 Flash 芯片成为最可靠的固件获取方式。常见 Flash 类型包括:SPI NOR(如 Winbond W25Q128)、SPI NAND(如 GD5F1GQ4)、并行 NOR/NAND 以及 eMMC。离线读取的核心思路是将 Flash 芯片从 PCB 上拆下(或使用夹具夹住),通过编程器读取原始数据。
该方法的优势在于完全绕过芯片的软件保护机制,直接获取物理存储介质上的数据;但风险在于拆焊过程可能损坏芯片或 PCB,且部分新型 Flash 支持 SFDP(Serial Flash Discoverable Parameters)加密或 OTP 区域保护。
操作流程与工具选择
- 拆焊 Flash:使用热风枪(温度 300-350°C)配合助焊剂拆下芯片,或使用烧录座(SOP8/SOP16)免拆读取。
- 识别芯片型号:读取芯片表面丝印,查询数据手册确认封装、电压和命令集。
- 连接编程器:将芯片放入编程器适配座,如 CH341A、RT809H 或 TL866II Plus。
- 读取数据:在编程器软件中选择芯片型号,执行读取操作并保存为 BIN 文件。
案例拆解:某路由器固件提取
某家用路由器使用 MediaTek MT7621AT 主控,外挂 16MB SPI NOR Flash(Winbond W25Q128JVSIQ)。设备未提供调试接口,且 U-Boot 控制台被密码保护。测试人员将 Flash 芯片拆下,使用 CH341A 编程器读取,得到完整 16MB 镜像。通过 binwalk 扫描发现 SquashFS 文件系统,成功提取 Web 管理界面源码,并从中发现一处命令注入漏洞(CVE-2023-XXXX)。
常见误区与复盘
- 误区一:忽略 Flash 电压。3.3V Flash 插入 5V 编程器可能导致芯片烧毁。
- 误区二:未备份原始数据。读取前应先读取一次并校验,防止后续操作损坏数据。
- 误区三:混淆字节序。部分 Flash 支持 QPI 模式,读取时需确保编程器使用正确的 SPI 模式。
3.3 固件镜像格式识别:BIN / HEX / ELF
核心原理
固件镜像的格式决定了后续分析工具的选择和逆向工程的复杂度。三种常见格式各有特点:BIN 是纯二进制数据,无任何元信息,需结合芯片基地址和内存映射手动加载;HEX(Intel HEX)是文本格式,包含地址记录和校验和,便于烧录但体积较大;ELF 是 Linux/嵌入式系统常用的可执行文件格式,包含段表、符号表和重定位信息,可直接用于 Ghidra/IDA 分析。
| 格式 | 文件头特征 | 地址信息 | 符号表 | 适用场景 |
|---|---|---|---|---|
| BIN | 无固定头 | 无(需手动指定基址) | 无 | 裸机固件、Bootloader |
| HEX | :020000040800F2 | 每行记录包含 16/32 位地址 | 无 | 烧录文件、小容量 Flash |
| ELF | \x7fELF | 程序头表(Program Header) | 有(.symtab/.dynsym) | Linux 用户态、RTOS 应用 |
判断方法与工具
使用 file 命令可快速识别格式:
$ file firmware.bin
firmware.bin: data
$ file firmware.hex
firmware.hex: Intel HEX (MCS-86) text
$ file app.elf
app.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)
对于 BIN 文件,可通过 binwalk 扫描内部结构:
$ binwalk firmware.bin
DECIMAL HEXADECIMAL DESCRIPTION
0 0x0 U-Boot boot loader
262144 0x40000 SquashFS filesystem
1048576 0x100000 JFFS2 filesystem
案例拆解:混合格式固件分析
某工业网关固件为 BIN 格式,大小 32MB。通过 binwalk 扫描发现:偏移 0x0 处为 U-Boot(含 0x100000 字节),偏移 0x100000 处为 Linux 内核(zImage),偏移 0x300000 处为 SquashFS 根文件系统。测试人员使用 dd 命令分割各段,分别加载到 Ghidra 中分析,最终定位到 Web 服务中的缓冲区溢出漏洞。
常见误区与复盘
- 误区一:忽略字节序。ARM 小端与 MIPS 大端在反汇编时需正确设置。
- 误区二:未识别压缩段。部分固件使用 LZMA/LZ4 压缩内核,需先解压再分析。
- 误区三:混淆加载地址。BIN 文件需根据链接脚本或 Bootloader 日志确定基址,否则反汇编结果完全错误。
3.4 固件加密与绕过思路
核心原理
为防止固件被提取和逆向,厂商常采用加密存储、安全启动(Secure Boot)和读保护(RDP)三重防护。加密存储指 Flash 中的数据以密文形式保存,需在芯片内部解密后才能执行;安全启动通过数字签名验证固件完整性,防止篡改;读保护则限制调试接口访问。绕过思路需根据防护强度分层突破:物理攻击(如探针、激光切割)、侧信道攻击(如功耗分析、电磁辐射)、协议漏洞利用(如 BootROM 漏洞)和逻辑绕过(如降级攻击)。
判断方法与绕过路径
首先判断加密类型:若读取的 BIN 文件熵值接近 8(高随机性),且无文件系统特征,则很可能已加密。常见绕过路径如下:
- 检查 BootROM 漏洞:部分芯片 BootROM 存在 USB 下载模式绕过,如 STM32 的 DFU 模式可通过设置 BOOT0 引脚进入。
- 电压故障注入:在 CPU 执行安全校验指令时,对 VDD 引脚注入毛刺,跳过签名验证。
- 密钥提取:通过侧信道分析(如 CPA)从加密引擎中提取 AES 密钥,或从芯片内部 E-Fuse 读取。
- 降级攻击:若设备支持固件升级,尝试刷入旧版本未加密固件,再通过调试接口读取。
常见误区与复盘
- 误区一:认为加密固件无法分析。即使无法解密,仍可通过黑盒测试、动态监控(如 UART 日志)和硬件探针获取敏感信息。
- 误区二:忽略安全启动的链式验证。BootROM 验证 Bootloader,Bootloader 验证内核,任何一环被绕过即可加载自定义代码。
- 误区三:过度依赖单一攻击方法。实际项目中常需组合使用多种技术,如 Glitch + 侧信道 + 逻辑漏洞。
固件获取与提取是嵌入式安全测试的基础能力,需要硬件、软件和密码学知识的综合运用。从调试接口直读到 Flash 拆解,从格式识别到加密绕过,每一步都需严谨操作和充分验证。建议读者在合法授权范围内,通过实验设备(如 STM32F407 开发板、树莓派 Pico)反复练习,逐步建立完整的固件提取工具箱和方法论。