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 读取操作步骤
- 焊接或夹子连接——SOIC-8用烧录夹最方便,但接触不良是常事。我建议直接焊线,尤其是批量操作时。
- 确认电压匹配——3.3V芯片接到5V必烧。我烧过一块W25Q128,教训深刻。
- 读取全片数据——用编程器软件读出来,保存为.bin文件。一般16MB的Flash读一次要3-5分钟。
- 校验——读两次做MD5比对,确保数据完整。
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。加电平转换板。
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文件系统解析有堆溢出。
操作流程大致是:
- 通过串口进入U-Boot命令行(按任意键中断启动)。
- 用
printenv看环境变量,找serverip、loadaddr等参数。 - 用
tftp或loadx加载恶意固件到内存。 - 触发漏洞,让Bootloader执行
md或mm命令dump Flash内容。
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,公钥也在固件里。虽然不能伪造签名,但可以提取出原始固件做离线分析。
3.5 四种方法对比与选择
我把这四种方法的核心差异整理了一下,方便你根据实际情况选:
| 方法 | 硬件接触 | 技术门槛 | 成功率 | 风险等级 | 适用场景 |
|---|---|---|---|---|---|
| Flash读取 | 需要 | 低 | 高(未加密时) | 中(可能焊坏) | 所有网关 |
| JTAG/SWD | 需要 | 中 | 中(受保护位影响) | 低 | 有调试接口的MCU |
| Bootloader漏洞 | 需要(串口) | 高 | 低(依赖漏洞) | 高(可能变砖) | 老旧或设计粗糙的设备 |
| OTA抓包 | 不需要 | 中 | 中(依赖加密强度) | 低 | 可远程访问的设备 |
我个人习惯是:先试OTA抓包,不行再拆机读Flash。JTAG和Bootloader漏洞作为备选,因为它们的成功率受设备个体差异影响太大。
3.6 本章知识体系
下面这张图把四种提取方法的核心流程和关键节点串起来了,你可以对照着看:
这张图把四种方法从起点到终点的路径画清楚了。你可以看到,无论走哪条路,最终目标都是拿到固件二进制文件。但每条路上的关键节点和风险点都不一样,选路之前先评估一下你的设备和环境。