第二章 固件提取技术:物理提取与逻辑提取
大家好,我是老周。做支付终端安全检测这些年,我最大的体会就是:拿不到固件,后面全是空谈。你想想看,固件就是设备的灵魂,我们做安全检测,第一步就是要把这个灵魂请出来。
这一章,我重点聊聊固件提取的两种主流思路——物理提取和逻辑提取。说白了,一个是用硬件手段硬取,一个是用软件漏洞巧取。两种方法各有千秋,我在项目里都踩过不少坑,今天一并分享给你们。
2.1 物理提取方法
物理提取,顾名思义,就是直接跟芯片硬件打交道。你得有工具、有耐心,还得有点手工活儿的底子。我刚开始做这行时,焊坏过好几块板子,心疼得不行。
2.1.1 SPI Flash 提取
SPI Flash 是支付终端里最常见的固件存储介质。为什么?因为它便宜、接口简单、容量也够用。大部分 POS 机、密码键盘都在用。
提取 SPI Flash 的流程其实不复杂:
- 定位芯片——在 PCB 上找到 SPI Flash 芯片,通常是 8 脚或 16 脚的小封装
- 连接编程器——用夹子或者焊接方式,把编程器的探针接到芯片引脚上
- 读取数据——用编程器软件读出整个 Flash 内容,保存为 .bin 文件
关键点:SPI Flash 的供电电压通常是 3.3V,但也有 1.8V 的。我曾经遇到过一台设备,编程器夹上去后芯片直接冒烟——后来才发现是电压不匹配。所以,先查 datasheet,再动手。
常用的编程器有这些:
| 编程器型号 | 支持协议 | 最高速率 | 我的评价 |
|---|---|---|---|
| CH341A | SPI, I2C | 8 MHz | 便宜够用,但稳定性一般 |
| TL866II Plus | SPI, 并口 | 24 MHz | 我主力工具,推荐 |
| Xgecu T48 | SPI, NAND | 48 MHz | 专业级,价格也专业 |
小技巧:如果芯片已经被焊死在板子上,别急着拆。先用 SOP8 夹子试试在线读取。我有一半的项目都能用夹子搞定,省了不少焊接的功夫。
2.1.2 JTAG 提取
JTAG 是调试接口,本来是给开发人员用的。但对我们安全检测来说,它也是一条通往固件的捷径。
JTAG 接口通常有 4 根信号线:TMS、TCK、TDI、TDO。再加上 VCC 和 GND,一共 6 根线。找到这些引脚,连上调试器,就能直接访问芯片内部的内存和寄存器。
我常用的 JTAG 调试器:
- J-Link——ARM 芯片的首选,稳定可靠
- OpenOCD + FT2232——开源方案,灵活但配置麻烦
- Bus Blaster——便宜,适合入门
注意:很多支付终端会在量产时禁用 JTAG 接口。但别灰心——我遇到过好几台设备,虽然 JTAG 被禁用了,但通过分析 PCB 走线,发现 JTAG 引脚其实还连着,只是没焊排针。焊上排针,接上调试器,照样能读。
2.1.3 BGA 提取
BGA(球栅阵列封装)是物理提取里最头疼的一种。芯片底部全是焊球,引脚根本看不见。为什么要提 BGA?因为现在越来越多的支付终端用 BGA 封装的 Flash 或主控芯片,为了防拆、防提取。
提取 BGA 芯片的步骤:
- 热风枪预热——温度控制在 280-320°C,风速中等
- 取下芯片——用镊子轻轻撬起,注意别弄掉焊盘
- 植球——清理焊盘,重新植上锡球
- 读取——用 BGA 适配座连接到编程器
说实话,BGA 提取的成功率不高。我自己的经验是,十次能成功六七次就算不错了。有一次为了提取一台老款 POS 机的固件,我连续焊废了三块芯片,最后只能放弃,改用逻辑提取方法。
我的建议:BGA 提取是最后的手段。如果条件允许,优先尝试 SPI Flash 夹子或者 JTAG。实在不行,再考虑 BGA。
2.2 逻辑提取方法
物理提取虽然直接,但风险高、门槛也高。逻辑提取就温和多了——通过软件漏洞或者调试接口,从运行中的系统里把固件"骗"出来。
2.2.1 Bootloader 漏洞利用
Bootloader 是设备上电后第一个运行的程序。它负责初始化硬件、加载操作系统。如果 Bootloader 有漏洞,我们就能在系统启动前拿到控制权。
常见的 Bootloader 漏洞类型:
- U-Boot 命令行未锁定——启动时按任意键进入命令行,直接 dump 内存
- 签名验证绕过——用伪造的固件镜像欺骗 Bootloader
- 缓冲区溢出——通过超长输入触发漏洞,执行任意代码
我记得有一次检测一台密码键盘,设备启动时串口输出了一行提示:Press any key to stop autoboot。我按了个空格,直接进了 U-Boot 命令行。输入 md.b 0x80000000 0x100000,固件就 dump 出来了。整个过程不到 5 分钟。
实战技巧:如果你不确定设备有没有 U-Boot,可以试试在启动时狂按回车、空格、Ctrl+C。很多开发人员懒得关掉调试输出,这就是我们的机会。
2.2.2 调试接口利用
除了 JTAG,设备上还有其他调试接口可以利用:
| 接口类型 | 提取方式 | 难度 |
|---|---|---|
| UART 串口 | 通过串口终端进入系统,用 cat /dev/mem 读取 | 低 |
| USB 调试 | 通过 ADB 或类似协议访问文件系统 | 中 |
| Ethernet 调试 | 通过网络服务(如 Telnet、SSH)远程提取 | 中 |
这里我要特别提一下 UART。很多支付终端的主板上都有 UART 焊盘,只是没焊排针。找到 TX、RX、GND 三个点,焊上排针,用 USB 转串口模块连接,就能看到系统启动日志。如果系统没有禁用 root 登录,你甚至可以直接拿到 shell。
避坑指南:我曾经遇到过一台设备,UART 输出正常,但输入没反应。折腾了半天才发现,TX 和 RX 焊反了。嗯,这种低级错误我也犯过,你们别学我。
2.3 知识体系总览
为了让大家更直观地理解本章内容,我画了一张图:
这张图把物理提取和逻辑提取的核心方法都列出来了。我个人建议,先软后硬,先简后繁。先试试 Bootloader 漏洞,不行再上 SPI Flash 夹子,最后才考虑 BGA。这样能最大程度降低风险。
好了,这一章的内容就到这里。固件提取是安全检测的敲门砖,掌握了这些方法,后面的逆向分析才能顺利展开。下一章我会讲固件解包和文件系统分析,到时候见。
本章要点回顾:
- 物理提取:SPI Flash(夹子/编程器)、JTAG(调试器)、BGA(热风枪+植球)
- 逻辑提取:Bootloader 漏洞(U-Boot 命令行、签名绕过)、调试接口(UART、USB、Ethernet)
- 优先级:先逻辑后物理,先简单后复杂
- 安全第一:注意电压匹配、引脚定义、防静电