物联网安全从零开始-路由器jtag调试分析

安全入门
2023-04-26 22:02
175720

背景

在前面的硬件安全初探小节中,我们使用编程器和uart调试引脚提取了tenda ac6路由器固件,掌握了通过uart接口获取固件以及获取终端进行调试分析。硬件安全中除了平时见到uart接口,我们在pcb板中也会经常碰到jtag接口,jtag接口也可以用来提取固件以及调试分析。在这一小节中,我们将简单学习如何识别jtag接口以及调试分析。

本次小节中需要用到的硬件设备和工具:TPlink Archer C7路由器、杜邦线、jtagulator以及jlink仿真器。

image.png

jtag基础

jtag的定义:

JTAG是联合测试工作组(Joint Test Action Group)的简称,是在名为标准测试访问端口和边界扫描结构的IEEE的标准1149.1的常用名称。此标准用于验证设计与测试生产出的印刷电路板功能。1990年JTAG正式由IEEE的1149.1-1990号文档标准化,在1994年,加入了补充文档对边界扫描描述语言(BSDL)进行了说明。从那时开始,这个标准被全球的电子企业广泛采用。边界扫描几乎成为了JTAG的同义词。在设计印刷电路版时,当前最主要用在测试集成电路的副区块,而且也提供一个在嵌入式系统很有用的调试机制,提供一个在系统中方便的"后门"。当使用一些调试工具像电路内模拟器用JTAG当做信号传输的机制,使得程序员可以经由JTAG去读取集成在CPU上的调试模块。调试模块可以让程序员调试嵌入式系统中的软件

简单来说,jtag并不像uart一样是某种通信协议,尽管具体表现都是我们可以在PCB板中看到的引脚接口。jtag是一种测试和调试设备芯片的方法,并且用到了边界扫描的技术 (边界扫描指向芯片发送数据,将输出与输入匹配,从而验证芯片是否正常运行。这里我的理解为硬件层面的暴力破解,但不是单点状态爆破而是一种链式爆破)。jtag的基本原理是在器件内部定义一个 TAP(Test Access Port:测试访问口)通过专用的 JTAG测试工具对进行内部节点进行测试。JTAG 测试允许多个器件通过 JTAG 接口串联在一起,形成一个 JTAG 链,能实现对各个器件分别测试。对于我们初学者而言,我们无需关注jtag是如何实现的 https://www.fpga4fun.com/JTAG2.html) ,我们只需知道jtag的几个功能就可以了,这几个功能分别为:

1.下载烧录,即可以对flash芯片进行烧录。

2.debug调试,可以对芯片以及外围设备进行调试分析。

3.芯片引脚诊断,可以测试芯片各种引脚的状态。

jtag常见引脚排列

在实际应用中,不同的IC公司会定义自家产品专属的JTAG接头。嵌入式系统中,常见的有10PIN、14PIN、16PIN以及20PIN四种JTAG接头,其引脚排列如下:

image.png

注:上图中仅为jtag的常见排列,需具体实例具体分析。

在tplink archer c7路由器的PCB板中,我们在左下角看到了单排4引脚接口和双排14引脚接口。经测试这里4引脚为uart接口,14引脚为jtag接口。接下来我们重点对jtag引脚进行识别以及连接jlink仿真器进行调试分析。

image.png

jtag引脚识别

jtagulator的使用

JTAGulator(http://www.grandideastudio.com/portfolio/jtagulator/) 是一种开源硬件工具,主要有自动识别接口,逻辑分析仪,烧录器三大功能,是一款很棒的硬件安全设备,非常适合学习硬件安全的人群。jtagulator可在某宝购买,也可自己印制,国内jtagulator使用手册(https://www.bilibili.com/read/cv13047230)。

jtagulator识别uart引脚

以上一小节tenda ac6路由器的uart引脚识别为例,我们在使用jtagulator之前,需先手动识别出GND引脚(万用表识别GND引脚可在上一小节查看)。识别出GND引脚后,我们分别连接路由器除GND外的几个引脚连接至jtagulator的channel 0,1,2,然后将路由器GND引脚连接到jtagulator的channel GND。随后路由器接通电源,将jtagulator的usb连接至我们的PC。

image.png

我们电脑中需打开终端模拟软件(这里我用的SecureCRT),使用串口连接,波特率设置为115200,点击连接后输入回车便出现jtagulator的banner。我们输入h命令可查看jtagulator的命令帮助。j命令为jtag模式,可针对jtag接口做系列操作如扫描jtag引脚和连接OpenOCD。u命令为进入uart模式,可针对uart接口做系列操作,如扫描uart引脚和使用uart接口调试。同理,G命令(GPIO接口)和S命令(SWD接口)也是对应的模式。

在进入相应模式之前,我们需使用v命令首先设置设备电压,一般情况下设置为3.3V。

image.png

设置好电压后,输入u进入uart模式,查看帮助命令后,我们可使用u扫描uart引脚,T命令只扫描TX引脚。P命令使用uart引脚进入终端。我们使用u命令开始扫描引脚,扫描前需要设置开始channel和结束channel,然后后面设置默认就行,输入space键开始扫描,等待片刻后jtagulator便会打印出引脚信息。如下图所示,TX引脚为channel 1,RX引脚为channel 0。jtagulator给出的波特率是扫描可见字符后猜测的,因为都是特殊符号,所以这里显示的波特率可能不太准确。

image.png

我们可继续用t命令继续扫描tx引脚来对上面的扫描结果进行验证,结果发现tx引脚确实是channel 1,并且这里还扫描出了波特率为115200。使用p命令进入终端进行测试(这里直接用jtagulator扫描出来的默认参数),参数设置好输入上小节分析出的密码进行登录,这时成功进入了终端。

image.png

jtagulator识别jtag引脚

首先用万用表测试tplink archer c7路由器GND引脚(方法在上一小节中已说明),随后将其他引脚都接入jtagulator的channel中。

image.png

使用SecureCRT连接,输入j进入jtag模式,查看帮助命令。j、i和b命令均为扫描jtag引脚,j和i命令速度较快,b命令较慢。r命令可以识别RTCK引脚,d命令获取设备的id编号,t为bypass测试,y为指令/数据寄存器测试,p为端口映射,o为OpenOCD接口模式。

image.png

使用j命令进行扫描,在扫描前同样需要设置开始channel和结束channel,然后后面设置默认就行,输入space键开始扫描,等待片刻后jtagulator便扫描出了jtag的几个接口,channel 1为TDI,channel 2为TDO,channel 4为TCK,channel 3 为TMS。有时候只运行j、i、b单个命令可能扫描不出来,所以我们可以把这三个命令都运行一遍,然后进行确认。

image.png

路由器的TCK,TMS,TDO,TDI和GND引脚,我们已经通过jtagulator判断出来了。如果我们想要利用jtag接口进行调试,我们还需使用万用表找到VIO引脚。在我们开启路由器后,通过判断引脚电压或短接的方法我们找出了VIO引脚。此时引脚分布情况如下图所示:

image.png

调试所要求的所有jtag引脚我们已经识别出来了,只需要和jlink的对应引脚进行连接就可以进行调试了。

image.png

如果我们想要调试时添加附加选项,就需要知道路由器中jtag的14个引脚的所有定义情况,这时就需要我们按照已经分析出来的引脚和芯片型号查找资料了。

image.png

jtag调试分析

jlink可以使用自带驱动调试MCU,但是由于jlink默认并不支持那么多设备型号(比如本小节中的QCA95xx)。这时我们就需要用到OpenOCD。

OpenOCD(Open On-Chip Debugger)开源片上调试器,是一款开源软件,最初是由Dominic Rath在大学期间发起的(2005年)项目。OpenOCD旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。

在前面的国内jtagulato使用手册链接以及后面内容ath79配置文件的链接中详细讲解了linux如何安装和调试OpenOCD,这里不再演示。windows调试的流程和linux大致相同,下面我将使用windows安装OpenOCD进行调试分析。

1.首先我们需要一台jlink仿真器,某宝D版100大洋左右,安装商家提供的jlink驱动软件或segger官网下载。下载OpenOCD windows压缩包(https://gnutoolchains.com/arm-eabi/openocd/),我们将其解压,然后将bin目录放入环境变量中。至此,OpenOCD已安装完成。

2.OpenOCD需要借助jlink来调试MCU。这里的OpenOCD需要将jlink作为普通usb来使用,所以也就需要我们替换一下jlink默认驱动,方法为下载Zadig 工具(https://zadig.akeo.ie/)并运行,进入 “Options” 菜单中选中 “List All Devices”。检查设备列表,选择相应的 Jlink 驱动,然后点击 "Replace Driver"。至此,驱动我们也安装好了。

3.进行调试流程。

OpenOCD常用命令
poll:查询目标板当前状态
halt:中断目标板的运行
resume [address]:恢复目标板的运行,如果指定了address,则从address处开始运行
step [address]:单步执行,如果指定了address,则从address处开始执行一条指令
reset:复位目标板
mdw <Addr> [Count]:显示从地址Addr开始的Count(缺省则默认为1)个字(4Bytes)
mdh <Addr> [Count]:显示从地址Addr开始的Count(缺省则默认为1)个半字(2Bytes)
mdb <Addr> [Count]:显示从地址Addr开始的Count(缺省则默认为1)个字节(1Byte)
mww <Addr> <Value>:向地址Addr写入Value,大小:一个字(4Bytes)
mwh <Addr> <Value>:向地址Addr写入Value,大小:一个半字(2Bytes)
mwb <Addr> <Value>:向地址Addr写入Value,大小:一个字节(1Bytes)
load_image <file> <address> ["bin"|"ihex"|"elf"]:将文件<file>载入地址为<address>的内存,格式有"bin"、"ihex"、"elf"
dump_image <file> <address> <size>:将内存从地址address开始的size字节数据读出,保存到文件<file>中。

将路由器的TCK,TMS,TDO,TDI,GND,TRST和VIO引脚分别连接到jlink的TCK、TMS、TDO、TDI、GND、nTRST和VTref接口后,jlink的usb接口接入电脑。

image.png

在开始OpenOCD运行调试之前,我们需要先确认OpenOCD的仿真器配置文件和目标设备配置文件。我们使用了jlink仿真器,所以配置文件为jlink.cfg (openocd/share/openocd/scripts/interface/jlink.cfg) 。那么目标设备配置文件的选择需要根据tplink archer c7 SoC型号 (QCA9558-AT4A) 来进行选择。通过查阅资料我们发现,我们OpenOCD调试时应使用ath79配置文件 (https://openwrt.org/docs/guide-user/hardware/debrick.ath79.using.jtag#ath79cfg), 我们将ath79.cfg复制到openocd/share/openocd/scripts/target 目录下。

image.png

使用 openocd -f interface/jlink.cfg -f target/ath79.cfg -c "adapter speed 15000" 运行调试,此时连接成功后,我们可用 GDB 远程连接 3333端口进行调试 ,4444端口可使用 telnet 连接,tcl可以连接6666端口。

注:"-f interface/jlink.cfg"为指定仿真器配置文件,"-f target/ath79.cfg"为指定目标配置文件,'-c "adapter speed 15000"'为执行adapter speed 15000命令。

image.png

我们开启一个终端,使用telnet连接本机4444端口,连接成功后,我们可使用reset命令复位目标板,此时发现设备返回0x00000001,确认我们已连接。我们还可以启动gdb使用target remote localhost:3333进行动态调试(OpenOCD提示我们应使用target extended-remote localhost:3333)。

image.png

halt命令中断目标板运行,reset init命令初始化ath79.cfg配置文件。

image.png

使用flash banks命令列出flash配置信息,根据索引序号,使用flash probe 0命令检测flash芯片的标识符及相关参数,发现为win w25q128fv/jv。比较查看archer c7路由器的flash芯片,发现一致,说明OpenOCD检测正确,并且OpenOCD检测出了flash的地址为0xbf000000。

image.png

使用flash info 0命令,查看flash芯片内存分布情况。

image.png

我们可以使用mdw <addr> [count]命令查看flash内存中的内容(下图中687173即为squashfs magic header),并使用dump_image firmware.bin 0xbf000000 0x1000000命令导出flash内存。后续我们就可以对固件进行分析和漏洞挖掘了。

image.png

总结

这一小节,我们简单学习jtagulator工具的使用,学会了如何识别jtag引脚,以及掌握如何通过仿真器连接jtag引脚进行调试分析。这些知识在我们后续使用测试钩子从MCU中引出调试引脚jtag/swd并提取固件时,也会非常有帮助。

参与评论

0 / 200

全部评论 1

iotstudy的头像
感觉棒棒的,需要买一个jtagulator和仿真器对吧。希望后面多出一些jtag方面的实战文档或视频,谢谢。
2023-05-10 22:10
投稿
签到
联系我们
关于我们