3、固件获取与提取技术:从Flash芯片读取、通过JTAG/SWD接口提取、利用Bootloader漏洞提取、OTA固件抓包

固件都拿不到,后面分析加固全是空谈。这一章我带你走一遍实战中真正管用的四种提取路子。每种方法都有它的适用场景和坑,我会把我在项目里踩过的雷一并说出来。

核心观点:没有万能的提取方法,只有最合适的组合拳。先做信息收集,再选技术路线。

3.1 从Flash芯片直接读取

这是最暴力也最可靠的方法。只要芯片没加密,拿编程器直接读就行。我最早做网关逆向时,第一件事就是拆机看PCB,找Flash型号。

3.1.1 识别Flash芯片

常见的封装有SOIC-8、SOIC-16、WSON-8、BGA等。看丝印查数据手册,确定接口类型:

接口类型 常见芯片 电压 编程器支持
SPI W25Q64、MX25L128 3.3V CH341A、TL866
Parallel NOR JS28F128 1.8V/3.3V 专用编程器
NAND MT29F2G08 3.3V RT809H、NAND编程器

3.1.2 读取操作步骤

  1. 焊接或夹子连接——SOIC-8用烧录夹最方便,但接触不良是常事。我建议直接焊线,尤其是批量操作时。
  2. 确认电压匹配——3.3V芯片接到5V必烧。我烧过一块W25Q128,教训深刻。
  3. 读取全片数据——用编程器软件读出来,保存为.bin文件。一般16MB的Flash读一次要3-5分钟。
  4. 校验——读两次做MD5比对,确保数据完整。
注意:有些网关会启用Flash的SRAM保护或OTP区域,编程器可能读不全。遇到这种情况,先查数据手册看保护位在哪。

3.2 通过JTAG/SWD接口提取

JTAG和SWD是调试接口,如果能连上,就能直接dump内存或Flash。这比拆Flash优雅得多,但前提是接口没被锁。

3.2.1 找到调试接口

PCB上找10针或20针的排针,或者找测试点。我常用的工具是JTAGulator,它能自动扫描出接口定义。SWD只需要SWDIO、SWCLK、GND三根线,JTAG需要TMS、TCK、TDI、TDO、GND。

3.2.2 常用工具与命令

OpenOCD是主力。连上后执行:

# 连接目标
openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

# 在telnet或gdb中
halt
dump_image firmware.bin 0x08000000 0x00100000

这里要注意地址范围。我遇到过有人把整个Flash都dump了,结果发现0x08000000到0x08020000是Bootloader,后面全是空数据。先读前256KB看看是不是你要的。

3.2.3 常见障碍

  • RDP(读保护)等级1或2——等级1可以用漏洞绕过,等级2基本没戏,只能换芯片。
  • JTAG/SWD被禁用——有些固件启动后就把调试接口关了。试试上电瞬间halt,或者用复位序列。
  • 电平不匹配——1.8V的调试接口接3.3V的调试器,会烧IO。加电平转换板。
经验之谈:我曾经遇到一个网关,JTAG接口被固件初始化成GPIO了。但上电前200ms调试接口还是激活的。用OpenOCD的reset halt配合短时序,成功在窗口期内连上并dump了固件。

3.3 利用Bootloader漏洞提取

Bootloader是固件的第一道门。如果它写得糙,漏洞就来了。我见过太多因为Bootloader没做输入校验导致固件被白嫖的案例。

3.3.1 常见漏洞类型

漏洞类型 原理 利用方式
缓冲区溢出 输入超长数据覆盖返回地址 控制PC指针,跳转到dump代码
命令注入 Bootloader解析命令时未过滤特殊字符 执行任意shell命令
未授权访问 调试/升级接口无密码或密码硬编码 直接进入维护模式
整数溢出 长度字段计算错误导致越界读 读取超出固件范围的内存

3.3.2 实战案例:U-Boot漏洞利用

很多网关用U-Boot作为Bootloader。U-Boot的网卡驱动和文件系统解析代码里,历史漏洞不少。我记得CVE-2019-13103就是U-Boot的ext4文件系统解析有堆溢出。

操作流程大致是:

  1. 通过串口进入U-Boot命令行(按任意键中断启动)。
  2. 用printenv看环境变量,找serverip、loadaddr等参数。
  3. 用tftp或loadx加载恶意固件到内存。
  4. 触发漏洞,让Bootloader执行md或mm命令dump Flash内容。
警告:利用Bootloader漏洞有风险。操作不当可能把Bootloader本身写坏,导致设备变砖。我建议先备份原始固件,再动手。

3.4 OTA固件抓包

如果物理接触不到设备,OTA抓包就是唯一的路。很多网关的OTA更新包没做加密,或者加密强度不够,抓下来直接解包就能拿到固件。

3.4.1 抓包环境搭建

我常用的方案:

  • 中间人代理——用Burp Suite或mitmproxy,配置网关的HTTP/HTTPS代理指向你的机器。
  • 网络嗅探——在网关和服务器之间接一个交换机做端口镜像,或者用ARP欺骗。
  • 无线抓包——如果网关用Wi-Fi,用Aircrack-ng套件抓802.11帧。

3.4.2 分析OTA协议

抓到包后,看请求URL和响应体。常见模式:

协议特征 可能的情况 应对方法
HTTP明文传输 固件直接暴露 直接下载.bin文件
HTTPS但证书固定 中间人会被检测 尝试替换固件中的CA证书
自定义加密协议 需要逆向加密算法 从固件中提取密钥或算法
分片下载+校验 防篡改机制 模拟服务器响应

3.4.3 绕过签名校验

就算抓到加密的OTA包,也不代表没戏。我曾经遇到一个网关,OTA包用AES-128-CBC加密,但密钥就硬编码在Bootloader里。从Flash dump里搜"key"字符串,直接找到了16字节的密钥。

解密后,里面还有一层签名校验。但签名算法是RSA-1024,公钥也在固件里。虽然不能伪造签名,但可以提取出原始固件做离线分析。

技巧:OTA抓包时,多抓几次升级流程。有些网关会先下载一个清单文件(manifest),里面包含固件版本、哈希值和下载地址。这个清单文件往往比固件本身更有价值。

3.5 四种方法对比与选择

我把这四种方法的核心差异整理了一下,方便你根据实际情况选:

方法 硬件接触 技术门槛 成功率 风险等级 适用场景
Flash读取 需要 低 高(未加密时) 中(可能焊坏) 所有网关
JTAG/SWD 需要 中 中(受保护位影响) 低 有调试接口的MCU
Bootloader漏洞 需要(串口) 高 低(依赖漏洞) 高(可能变砖) 老旧或设计粗糙的设备
OTA抓包 不需要 中 中(依赖加密强度) 低 可远程访问的设备

我个人习惯是:先试OTA抓包,不行再拆机读Flash。JTAG和Bootloader漏洞作为备选,因为它们的成功率受设备个体差异影响太大。

3.6 本章知识体系

下面这张图把四种提取方法的核心流程和关键节点串起来了,你可以对照着看:

固件获取与提取技术知识体系 固件获取与提取技术全景图 目标设备固件 Flash芯片读取 识别芯片型号/封装 烧录夹/焊接连接 编程器读取+校验 JTAG/SWD接口 扫描接口定义 OpenOCD连接+halt dump_image导出 Bootloader漏洞 进入Bootloader模式 触发溢出/注入 控制PC执行dump OTA固件抓包 中间人代理/嗅探 分析协议/解密 固件二进制文件 (.bin / .hex) 注意保护位和电压匹配 风险高,先备份再操作

这张图把四种方法从起点到终点的路径画清楚了。你可以看到,无论走哪条路,最终目标都是拿到固件二进制文件。但每条路上的关键节点和风险点都不一样,选路之前先评估一下你的设备和环境。

总结一下:Flash读取最稳,JTAG/SWD最优雅,Bootloader漏洞最刺激,OTA抓包最隐蔽。实际项目中,我经常组合使用——先OTA抓包看看有没有突破口,不行就拆机读Flash,最后再用JTAG验证一下内存布局。多一条路,多一分把握。