4、UART串口提取实战:UART引脚定位、逻辑分析仪抓取、波特率识别、通过Bootloader交互获取固件

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是IoT设备中最常见、也最容易被忽视的调试接口。绝大多数嵌入式主控芯片(如STM32、NXP i.MX、联发科MT7628、Realtek RTL8197等)在硬件设计阶段就会预留UART调试口,用于系统启动日志输出、Bootloader交互和内核调试。对于固件逆向工程师而言,UART串口往往是获取设备控制权、转储固件、修改启动参数的最短路径。本章将围绕UART提取固件的完整链路展开:从PCB板上定位UART测试点,到使用逻辑分析仪抓取波形并识别波特率,再到通过Bootloader交互接口实现固件转储与系统Shell获取,形成一套可复用的实战方法论。

UART串口提取固件工程链路图 ① 引脚定位 PCB走线/万用表/手册 ② 逻辑分析仪抓取 TX/RX波形采集 ③ 波特率识别 位宽测量/自动检测 ④ 固件获取 Bootloader/Shell 主控SoC MT7628 / STM32 / i.MX6 内置UART控制器 UART_TX UART_RX GND 调试排针 VCC 3.3V TX RX GND 逻辑分析仪 采样率 ≥ 10MHz 通道 CH0-CH7 探头 USB-TTL适配器 CP2102 / CH340 3.3V电平 主机分析终端 PuTTY / minicom / screen 固件转储文件 flash.bin / kernel.bin 串口传输 图:UART固件提取四阶段工程链路(引脚定位→波形抓取→波特率识别→Bootloader交互)

上图展示了UART提取固件的完整工程链路。实际工作中,四个阶段并非严格串行——熟练的工程师往往在定位引脚的同时就接好逻辑分析仪,在抓取波形的同时就能初步判断波特率。但理解每个阶段的独立方法论,是应对各种非标设备的基础。

4.1 UART引脚定位:从PCB裸板到可靠连接

核心原理:UART接口在PCB上通常以测试点(Test Point)、排针(Pin Header)或焊盘(Pad)形式存在。典型UART至少需要三根线:TX(发送)、RX(接收)、GND(地线)。部分设备还会引出VCC(供电)用于电平参考,但调试时严禁直接连接VCC,以免烧毁调试工具或目标板。UART信号在空闲状态为高电平(逻辑1),起始位为低电平(逻辑0),这一电气特征为后续定位提供了判断依据。

定位方法:

  1. 视觉排查法:优先寻找PCB上标注有“UART”、“DEBUG”、“TX”、“RX”、“TXD”、“RXD”等丝印的排针或测试点。常见位置在板边、主控芯片附近或网络变压器旁。
  2. 原理图/手册查阅法:若设备开源或泄露过原理图,直接查找主控芯片的UART引脚定义(如STM32的PA9/PA10,MT7628的UART0_TXD/RXD)。即使没有完整原理图,芯片Datasheet中的Pinout Diagram也能提供参考。
  3. 万用表电压测量法:将万用表调至直流电压档(20V量程),黑表笔接设备地(通常为金属屏蔽壳或USB座外壳),红表笔依次触碰可疑焊点。上电后,UART TX引脚在空闲时应有3.3V或1.8V的高电平(部分老设备为5V),而RX引脚通常为高阻态或弱上拉,电压接近VCC。若发现某引脚电压稳定在VCC且不随系统启动变化,极有可能是TX。
  4. 逻辑分析仪扫描法:将逻辑分析仪多个通道分别连接可疑引脚,同时抓取设备上电瞬间的波形。UART TX引脚在Bootloader启动时会输出连续的调试日志,波形呈现密集的方波脉冲串,与其他引脚的静态电平形成鲜明对比。
经验提示:部分设备(尤其是路由器)的UART TX/RX并非直接引出,而是经过0欧电阻或磁珠连接到调试排针。若测量不到信号,可沿主控芯片引脚走线查找串联电阻,直接焊接飞线到电阻靠近芯片的一端。
定位手段适用场景关键判据风险等级
丝印视觉排查开发板、工程样机“TX/RX/GND”标注低
原理图查阅有开源资料设备芯片Pinout对应关系低
万用表测电压所有设备空闲高电平(VCC)中(需防短路)
逻辑分析仪扫描无标注、无资料设备上电瞬间方波脉冲低

4.2 逻辑分析仪抓取与波特率识别

核心原理:UART是异步串行协议,没有独立的时钟线,收发双方必须约定相同的波特率(Baud Rate)。波特率表示每秒传输的码元数,常见值有9600、57600、115200、460800等。逻辑分析仪以远高于信号频率的采样率(建议≥10MHz)对TX/RX引脚进行连续采样,记录完整的电平变化时序,再通过软件解码得到实际波特率。

操作流程:

  1. 硬件连接:逻辑分析仪通道CH0接设备TX,CH1接设备RX,GND与设备共地。注意:逻辑分析仪输入阻抗较高,不会影响目标电路工作。
  2. 参数设置:采样率设为10MHz或更高,采样深度根据Bootloader日志长度调整(通常2MB足够)。触发方式设为“上升沿”或“下降沿”,以便捕捉启动瞬间的数据。
  3. 抓取波形:给设备上电,逻辑分析仪自动捕获Bootloader输出的UART数据帧。
  4. 波特率计算:在分析软件(如Saleae Logic、PulseView)中,测量一个完整数据帧(起始位+8数据位+停止位)的时长。例如,测得1位宽度为8.68μs,则波特率≈1/8.68μs≈115200bps。更简便的方法是使用软件自带的“Async Serial”解码器,手动输入候选波特率(9600/19200/38400/57600/115200),观察解码出的ASCII字符是否可读。
# Saleae Logic软件中手动测量位宽示例
# 测量结果:1位时间为8.68μs
# 波特率 = 1 / 0.00000868 ≈ 115200 bps
# 若测得位宽为104.2μs,则波特率 ≈ 9600 bps

常见误区:部分工程师直接使用串口助手盲扫波特率,虽然可行但效率低下。逻辑分析仪的优势在于能同时观察TX和RX双向数据,且能捕获启动瞬间的一次性日志——这些日志往往包含内核版本、文件系统挂载信息、甚至明文密码,对后续攻击面分析至关重要。

4.3 Bootloader交互与固件转储实战

核心原理:Bootloader(如U-Boot、RedBoot、CFE)是设备上电后最先运行的程序,负责初始化硬件、引导操作系统。绝大多数Bootloader提供交互式命令行接口,支持通过UART输入命令。利用Bootloader的md(内存查看)、mw(内存写入)、loadb(二进制加载)、flash(Flash操作)等命令,可以直接读取Flash芯片内容并转储到主机,实现固件提取。

实战案例:某品牌IP摄像头固件提取

背景与约束:目标设备为某安防厂商的IP摄像头,主控芯片为海思Hi3518EV200,Flash为16MB SPI NOR。设备无网络调试接口,仅有PCB上4针UART排针(未标注丝印)。目标是获取完整固件以分析其隐藏功能。

初始现象:万用表测量排针电压,发现第2脚为3.3V恒定高电平,第3脚为0V,第4脚为GND。初步判断第2脚为TX,第3脚为RX。

关键操作步骤:

  1. 波形验证:连接逻辑分析仪至第2脚,上电抓取波形,解码出字符串“U-Boot 2013.10 (Nov 07 2016 - 15:23:45)”,确认TX无误,波特率为115200。
  2. 建立串口会话:使用USB-TTL适配器连接(TX接设备RX,RX接设备TX,GND共地),主机打开PuTTY(115200, 8N1)。上电后迅速按下Ctrl+C,成功进入U-Boot命令行。
  3. 查看Flash布局:输入flinfo命令,显示Flash为16MB,扇区大小64KB。输入md 0x80000000 0x100查看内存映射,确认Flash基地址为0x80000000。
  4. 转储固件:在U-Boot中执行mw.b 0x82000000 0xff 0x1000000(将内存区域填充0xFF),然后执行sf read 0x82000000 0x0 0x1000000(将Flash内容读取到内存)。最后通过loadb 0x82000000 115200配合主机的screen命令接收二进制数据。
# 主机端接收固件(Linux)
$ screen /dev/ttyUSB0 115200 < /dev/null > flash_dump.bin
# 在U-Boot中执行:
# sf read 0x82000000 0x0 0x1000000
# loadb 0x82000000 115200
# 等待传输完成,Ctrl+A K退出screen

结果对比:转储得到的flash_dump.bin大小为16MB,使用binwalk扫描,识别出U-Boot镜像、Linux内核(LZMA压缩)、Squashfs文件系统及JFFS2配置分区。成功解包后提取到设备默认密码哈希和云平台通信密钥。

风险与代价:整个操作过程中,设备因Bootloader中断而无法正常启动,但未对Flash进行写操作,重启后恢复原状。风险点在于loadb传输时若波特率不匹配或线路干扰,可能导致内存数据错乱,需重新读取。

安全警告:Bootloader交互具有最高权限,误操作(如sf erase、mw写错地址)可能永久损坏设备。实战中务必先执行flinfo和md等只读命令确认环境,再执行写操作。对于生产环境设备,建议先备份完整Flash再尝试任何修改。

4.4 常见误区与总结复盘

误区一:忽视电平标准。部分设备UART为1.8V电平,直接连接3.3V的USB-TTL适配器可能导致信号无法识别甚至损坏引脚。解决方法是使用支持1.8V的调试工具(如FT232H配合电平转换芯片),或测量TX空闲电压判断电平域。

误区二:TX/RX接反。交叉连接是基本原则(设备TX接适配器RX),但部分设备丝印标注的是“从设备角度”还是“从主机角度”并不统一。若连接后无输出,尝试交换TX/RX。

误区三:忽略Bootloader中断窗口。许多设备仅在启动后1-2秒内接受中断按键,错过窗口则进入正常系统启动流程。解决方法是使用逻辑分析仪抓取启动日志,观察“Hit any key to stop autoboot”提示,并提前将终端软件设置为“发送Break信号”或“自动发送Ctrl+C”。

误区四:只关注UART而忽略其他调试接口。部分新设备已禁用UART输出(通过电阻移除或软件配置),但保留了JTAG/SWD接口。若UART无信号,应转向JTAG边界扫描或SPI Flash离线读取。

总结复盘:UART提取固件的核心在于“定位-抓取-识别-交互”四步法。定位阶段依赖硬件功底和耐心,抓取阶段依赖工具精度,识别阶段依赖对协议的理解,交互阶段则考验对Bootloader命令集的熟悉程度。建议在实验环境中使用开发板(如树莓派、STM32F407)反复练习UART调试,熟悉不同Bootloader(U-Boot、Barebox)的命令差异。掌握本章技术后,读者应能独立完成大多数基于Linux的IoT设备固件提取工作,为后续的固件解包、文件系统分析和漏洞挖掘奠定基础。