3、固件获取与提取:从芯片读取固件(JTAG/SWD)、拆解设备获取Flash、固件镜像格式识别(bin/hex/elf)、固件加密与绕过思路

固件获取是嵌入式安全测试的起点,也是决定后续分析深度与效率的关键环节。在实际渗透与漏洞挖掘项目中,测试人员往往面临三种典型场景:设备具备调试接口(JTAG/SWD)可直读、设备需拆解后通过编程器离线读取Flash、设备固件经过加密或签名保护需先绕过防护。本章将系统讲解从硬件接口读取、芯片拆解、镜像格式识别到加密绕过思路的完整技术链路,帮助读者建立一套可复用的固件提取方法论。

固件获取与提取技术链路 物理获取方式 JTAG/SWD 调试接口直读 拆解设备 + 编程器离线读取 Bootloader 控制台导出 镜像格式识别 BIN:裸二进制镜像 HEX:Intel HEX 文本格式 ELF:含符号与段信息 加密与绕过思路 安全位/读保护绕过 BootROM 漏洞利用 密钥提取与解密 输出:可分析的固件镜像 → 文件系统提取 → 漏洞挖掘 调试接口工具 OpenOCD J-Link / ST-Link Bus Pirate Flash 编程器 CH341A RT809H TL866II Plus 分析工具 binwalk Ghidra / IDA Pro QEMU 模拟执行

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 等工具自动识别。

接口类型信号线电压范围典型速率适用场景
JTAGTMS, TCK, TDI, TDO, (TRST)1.8V - 5V10-50 MHz复杂芯片、多核调试
SWDSWDIO, SWCLK1.2V - 3.3V最高 50 MHzARM Cortex-M 系列
cJTAGTCK, TMS(复用)1.8V - 3.3V10-30 MHz引脚受限的 IoT 模块

操作流程如下:

  1. 识别接口:使用 JTAGulator 或逻辑分析仪扫描 PCB 上的测试点,识别信号线定义。
  2. 连接调试器:将 J-Link、ST-Link 或 OpenOCD 支持的调试器与目标板连接,注意电平匹配(1.8V/3.3V)。
  3. 枚举设备:执行 openocd -f interface/jlink.cfg -f target/stm32f4x.cfg 等命令,确认调试器能识别芯片。
  4. 读取固件:使用 flash read_bank 0 firmware.bin 0 0x100000 或 dump_image 命令导出 Flash 内容。
经验提示:若设备已禁用调试接口,可尝试以下方法:1) 检查芯片数据手册中读保护(RDP)等级,部分芯片支持通过复位引脚电平触发 BootROM 恢复;2) 使用电压故障注入(Glitch)绕过读保护,但需注意可能损坏芯片;3) 寻找 PCB 上未焊接的调试电阻位,补焊后可能恢复接口功能。

案例拆解:某智能摄像头固件提取

某品牌智能摄像头采用海思 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 区域保护。

操作流程与工具选择

  1. 拆焊 Flash:使用热风枪(温度 300-350°C)配合助焊剂拆下芯片,或使用烧录座(SOP8/SOP16)免拆读取。
  2. 识别芯片型号:读取芯片表面丝印,查询数据手册确认封装、电压和命令集。
  3. 连接编程器:将芯片放入编程器适配座,如 CH341A、RT809H 或 TL866II Plus。
  4. 读取数据:在编程器软件中选择芯片型号,执行读取操作并保存为 BIN 文件。
风险提示:拆焊时温度过高或时间过长可能导致 Flash 内部数据损坏;部分 BGA 封装芯片(如 eMMC)需要专业返修台,不建议手工操作。此外,读取前应确认芯片是否处于加密状态——部分 SPI NOR 支持 OTP 锁定或 AES 加密,直接读取可能得到密文。

案例拆解:某路由器固件提取

某家用路由器使用 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(高随机性),且无文件系统特征,则很可能已加密。常见绕过路径如下:

  1. 检查 BootROM 漏洞:部分芯片 BootROM 存在 USB 下载模式绕过,如 STM32 的 DFU 模式可通过设置 BOOT0 引脚进入。
  2. 电压故障注入:在 CPU 执行安全校验指令时,对 VDD 引脚注入毛刺,跳过签名验证。
  3. 密钥提取:通过侧信道分析(如 CPA)从加密引擎中提取 AES 密钥,或从芯片内部 E-Fuse 读取。
  4. 降级攻击:若设备支持固件升级,尝试刷入旧版本未加密固件,再通过调试接口读取。
实战案例:某智能门锁使用 NXP LPC55S69 主控,固件 AES-256 加密并启用安全启动。测试人员通过电压故障注入(Glitch)在 BootROM 校验阶段跳过签名检查,使芯片进入 UART 下载模式,随后通过 ISP 协议读取解密后的固件。整个过程需精确控制 Glitch 注入时间(误差 ±10ns),使用 ChipWhisperer 工具完成。

常见误区与复盘

  • 误区一:认为加密固件无法分析。即使无法解密,仍可通过黑盒测试、动态监控(如 UART 日志)和硬件探针获取敏感信息。
  • 误区二:忽略安全启动的链式验证。BootROM 验证 Bootloader,Bootloader 验证内核,任何一环被绕过即可加载自定义代码。
  • 误区三:过度依赖单一攻击方法。实际项目中常需组合使用多种技术,如 Glitch + 侧信道 + 逻辑漏洞。

固件获取与提取是嵌入式安全测试的基础能力,需要硬件、软件和密码学知识的综合运用。从调试接口直读到 Flash 拆解,从格式识别到加密绕过,每一步都需严谨操作和充分验证。建议读者在合法授权范围内,通过实验设备(如 STM32F407 开发板、树莓派 Pico)反复练习,逐步建立完整的固件提取工具箱和方法论。