JTAG – 微控制器调试
作为职业生涯大部分时间从事嵌入式固件工程的工程师,当我了解到使用JTAG逆向工程固件时,迅速被其吸引。我决定将这个项目作为学习这个有些晦涩且常被忽视的攻击向量的机会。
JTAG(以制定该标准的联合测试行动组命名)是一种行业标准,用于验证设计并在制造后测试印刷电路板。JTAG实现了电子设计自动化(EDA)中的片上仪器标准,作为数字模拟的补充工具。它规定了使用专用调试端口实现串行通信接口,以低开销访问,无需直接外部访问系统地址和数据总线。该接口连接到片上测试访问端口(TAP),实现状态协议以访问一组测试寄存器,这些寄存器呈现芯片逻辑电平和各种部件的设备功能。联合测试行动组成立于1985年,旨在开发一种验证设计和测试制造后电路板的方法。1990年,电气和电子工程师学会将这一努力的结果编入IEEE标准1149.1-1990,题为“标准测试访问端口和边界扫描架构”。
JTAG是一种行业标准的测试访问端口,用于在PCB组装后调试和运行集成电路的诊断。最初为制造商提供了一种简化电路板设计测试的方法,现在甚至更相关,因为设备使用球栅阵列(BGA),由于尺寸减小而难以测试。此外,暴露的接口为工程师提供了评估信号的手段,而无需使用物理连接直接接口电路。
在回顾了各种JTAG相关视频后,我发现了访问目标设备的许多积极好处,尤其是读写这些设备的能力。可能性似乎是无限的。
为了开始,我在当地车库销售中找到了一个Linksys BEFSR41 ver2路由器,并开始尝试使用许多JTAG硬件和软件工具进行实验。我决心复制一些视频中看到的努力和成就。
经过大量研究,我决定购买Parallax的JTAGulator板,以及一些流行的串行接口板,DangerousPrototypes的Bus Pirate和Bus Blaster,以及Attify Badge。
我从JTAGulator开始,这是一个由Joe Grand设计的开源硬件工具,不仅用于定位,还用于识别目标板上的JTAG引脚,从而提供查找片上调试(OCD)接口的能力。该工具还具有定位和识别UART引脚的功能。
定位和识别目标板上的JTAG引脚
在开始之前,我首先找到并打印了目标板Linksys BEFSR41 ver2路由器的数据表。
我很快在板上找到了以下设备:
- CPU:Samsung S3C4510001 ARM7TDI 50Mhz
- 闪存:MX 29F040QC-90 5伏CMOS(512Kbit x 8)0.5 Mbyte
- SDRAM内存:SI IC41C16256-35K x2 512Kbyte – 256K x 16动态RAM
- 以太网控制器:RealTek RTL8019AS ISA全双工控制器
- KENDIN KS8995E 5端口10/100集成交换机
基于观看JTAGulator板教学视频(由其作者Joe Grand制作)获得的信息,我确定JP-1可能是一个JTAG TAP(测试访问点)。
识别JTAG引脚
通常,你会在PCB上找到TMS、TCK、TDI、TDO等铭文,所以你知道你正在处理支持JTAG的设备,但当引脚未标记且你需要依赖第三方文档时,它会变得更加困难。
当然,你的板也可能有一个JTAG头,而不仅仅是引脚/触点。JTAG访问点通常被板设计者故意隐藏,并且在大多数情况下缺少头或板标记。你可能还会获得板上微控制器的数据表。有时,引脚标有JTAG参考,PCB迹线可能引出到一个访问点。
例如:
在我的目标板上,JP-1是一个无头的2 x 7行馈通引脚插座。
最后,我需要定位目标设备上的地,并将其跳线到JTAGulator板上的GND引脚。注意:JTAGulator和目标设备必须在继续进行任何测试之前共享一个共同的地点(以确保正确的参考电压和可靠的读数)。
此外,使用拆焊工具(吸锡器),我清除了JP-1引脚插座中的焊料,并焊接了(2)个7针公头,以便为我的调试连接跳线。
使用万用表,我确定引脚2、4、6、8、10、12和14都连接到电路地。这留下了8个(未知)引脚,其中5个可能是4个必需(和1个可选)JTAG引脚:
- TDI:测试数据输入
- TDO:测试数据输出
- TMS:测试模式选择
- TCK:测试时钟
- TRST:测试复位(可选)
使用JTAGulator板上的通道0到7,我将跳线连接到目标设备上的8个(未知)引脚(连接顺序无关)。注意:引脚14是绿色(GND)跳线。
此时,我为目标设备供电(使用制造商提供的9VDC适配器),然后通过迷你USB电缆为JTAGulator板供电到我的Linux桌面。
在Linux机器的命令shell中,我定位了JTAGulator的串行端口,并使用picocom建立了串行连接,picocom是一个最小的哑终端仿真程序,非常适合访问基于串行端口的Linux控制台。
安装picocom: 在Ubuntu上,你可以简单地: sudo apt-get install picocom
从QuickStart说明中摘录:https://www.parallax.com/sites/default/files/downloads/32115-JTAGulator-Product-Brief-1.1.pdf JTAGulator由主机计算机的USB端口供电,并使用行业标准的FTDI FT232RL设备提供USB连接(驱动程序可从www.ftdichip.com/Drivers/VCP.htm获得)。该设备将显示为虚拟COM端口,并将自动分配一个COM端口号。所有通信均为115200 bps,8数据位,无奇偶校验,1停止位。使用终端程序(例如,HyperTerminal、PuTTY、CoolTerm、picocom或screen)与JTAGulator通信。
$ dmesg | grep tty(确定串行设备端口)
$ sudo picocom -b 115200 -r -l /dev/ttyUSB0(-b = 波特率 and -r = 无复位 and -l = 无锁)
- 点击[ENTER]得到‘:’ JTAGulator命令提示符
- H(打印可用命令)
- 在继续进行之前,我需要确定目标设备的系统电压。这是通过设置万用表进行DC电压测量并检查目标板周围的各个点(包括我焊接的头)来完成的。确定系统电压为3.3伏。
- V 设置目标系统电压(1.2V至3.3V)
- 在执行识别JTAG引脚分配(BYPASS扫描)之前,我执行了识别JTAG引脚分配(IDCODE扫描)
- 执行ID代码扫描比Bypass扫描快得多(不需要TDI,导致更少的扫描排列),尽管ID扫描只找到4个必需JTAG引脚中的3个。
- I 识别JTAG引脚分配(IDCODE扫描)
- 执行获取设备ID命令提供…
- D 获取设备ID(s)
- 执行识别JTAG引脚分配(BYPASS扫描)命令为我们提供4个必需JTAG引脚(和可选TRST引脚)分配。
- B 识别JTAG引脚分配(BYPASS扫描)
- 执行测试BYPASS(TDI TDO)命令验证在TDI上发送到目标设备的32位随机数据是否正确通过TDO返回到JTAGulator
- T 测试BYPASS(TDI TDO)
总结
当尝试识别可疑JTAG引脚时,使用JTAGulator始终是一个宝贵的工具,并强烈推荐。结合知道JTAG引脚分配,连接一个JTAG兼容的USB适配器和一些好的调试工具(OpenOCD、GDB、binwalk等),你应该能够成功与你的硬件目标通信。
总之,可以安全地说,供应商可能很快意识到隐藏这些TAP以保护其专有利益的重要性。这些TAP已经存在很长时间了,我不认为它们会很快消失,因为它们对制造周期确实很重要。使用上述方法,以及获取适当的SoC(片上系统)数据表,可以帮助你定位更隐蔽的TAP。很多时候,只需查看芯片本身附近就可以提供线索。其他时候,TAP可能隐藏在被讨论的SoC下,需要移除芯片。跟踪迹线,尽管可能困难,也可以引导你到潜在的测试点。