原文作者:Juan Carlos Jiménez
翻译者:光棍节
原文地址:http://jcjc-dev.com/2016/04/08/reversing-huawei-router-1-find-uart/
本系列教程以华为HG533路由器为例,开展的一系列逆向研究,包括查找调试接口,搜寻固件,数据流跟踪,flash内容提取以及对固件的漏洞挖掘等。
在设备开发的过程中,串口是开发人员保留在电路板上的供调试或者支持未来可扩展的接口,寻找串口也是硬件逆向工程的最基础的工作之一。
在商业产品中,大部分的UART串口都是4引脚或6引脚的存在于设备中,由于串口的设计并不是为最终的用户服务的,所以通常并没有焊上引针或连接器。
通过查找HG533路由器的主板接口,我们发现了2组未使用的接口,如图二所示的UART1和UART2,其中的排针是后来焊上去的。
由上图二可以知道,设备提供了两套不同的串口用于与不同的集成电路的通信,根据在电路板上的位置以及分析他们的线路连接,我们能够分析出哪一个串口是连接到主集成电路上,从主集成电路上的串口才能获取更多的数据。
在发现了2组接口后,首先要判断其中是否有无用的引脚,最简单的方法就是从背面用强光照射电路板,然后从正面看电路板上引脚环的样子来判断引脚的链接情况。如图三所示。
以图中的中间串口为例,从左至右(1--5)代表的意思是:
1:与某层电路板连接 2:空接口,没有连接任何引线 3:100%的很厚的连接,一般是与电源相关,如Vcc或接地 4:与多层电路板都有连接,很可能是其他的电源引脚,一般情况下,调试接口上的引脚没有必要与4层以上的不同电路板连接。 5:与1相似,与某层电路板连接
由于这些接口的垫圈很硬而且熔点很高,垫圈会穿透整个电路板,中间有一个小孔,第一个串口,我用排针一起焊上,费了好大的力气才完成,对于第二个串口,我采用一个个的排针穿过垫圈,然后在pcb板的背面焊上焊锡,立刻好看多了。如图四所示。
在步骤1中,我们得到了每一个可能串口接口上仅有三个有用的引脚。但是还不清楚是否是使用了串口协议,但是当前的接口数量与位置排列非常像UART串口。
串口的协议,以6引脚为例:
Tx:发送引脚,与调试设备的接收引脚相连 Rx:接收引脚,与调试设备的发送引脚相连 GND:接地,与调试设备的接地相连 Vcc:电源高位,一般为3.3v或者5v,一般不连接 CTS:通常不使用 DTR:通常不使用
所以总结上面步骤一的引脚,得出如下的结论:
1、3个未确定的引脚分别对应着Tx、Rx和GND 2、有两个引脚非常像Vcc和GND 3、Tx一般会被默认接上高电平 4、Rx也会被默认接上高电平,当我们给这个引脚提供低电平的时候,才会变成0
通过上述的分析,我们似乎已经可以使用USB转串口设备进行组合测试,但是不清楚的盲目测试很容易导致设备被烧坏。
所以我们接着利用电压表或者逻辑分析仪来详细的分析引脚,当然用示波器将会得到更好的效果。
在用示波器测试引脚后,我们得到了如下的结论,引脚情况如图六所示:
1:GND和Vcc分别对应于引脚4和引脚3(此处的翻译与原文有点不一致,判断原文描述应该有点问题),其中电压值为3.3v 2:Tx验证,那个正在发送信息的导致电平值一直变化 3:Rx验证,示波器显示电平值始终不变化
接下来就是要获取串口通信的波特率,我们可以通过测试常用的几个波特率猜测获取,也可以通过示波器或者逻辑分析仪测试获取。如图七所示,当测试了正确的波特率时,就可以得到可读取的串口通信数据。
在获取了硬件端所有的信息之后,接下来就是研究与设备之间的通信,使用USB转串口工具测试,在实验中,我们同时测试两个串口,其中一个连接到示波器上,如图八所示。
与电脑相连的串口终端开始打印出有用的信息,如图九所示。
Please choose operation: 3: Boot system code via Flash (default). 4: Entr boot command line interface. 0
当按下4的时候,就可以获取与设备bootloader交互的命令行接口。当按下3的时候,在设备启动完成后,将会得到Welcome to ATP Cli 和登录的提示。默认的账号和密码为admin:admin。登录之后,运行shell命令,将可以以root权限运行Linux命令。如下所示:
------------------------------- -----Welcome to ATP Cli------ ------------------------------- Login: admin Password: #Password is ‘admin' ATP>shell BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash) Enter 'help' for a list of built-in commands. # ls var usr tmp sbin proc mnt lib init etc dev bin
如果擅自修改这个默认的账号名和密码,将会导致设备无法正常的启动。