嵌入式 RE 介绍之通过 UBOOT 破解 UART (上)
2022-2-14 11:55:0 Author: www.4hou.com(查看原文) 阅读量:43 收藏

这篇文章将以Arcade 1UP Marvel 街机为目标,重点介绍 UART、UBoot 和 USB。 Arcade1UP系列街机自从推出以来,已经有很多玩家在研究如何更换机柜的内部组件来运行通用 MAME 软件。这篇文章将着眼于现有的硬件,并讨论如何提取固件。

1.png

在这篇文章,我们将介绍以下内容:

1.拆卸现有嵌入式系统的支撑硬件;

2.通过 IC 标记识别组件;

3.用万用表测量连接器电压;

4.逻辑分析仪的使用和设置;

5.UBoot分析和审查;

6.使用 depthcharge 编写 UBoot 交互脚本;

这篇文章旨在介绍在目标系统上定位活动的 UART、如何接近 UBoot 控制台以及最终如何利用这两个组件从我们的目标中提取闪存。阅读本文后,你将熟悉屏幕实用程序depthcharge python3库。

硬件概述

在查看新目标时,首要任务之一是检查可用的接口。在这个街机柜的例子中,可用的接口乍一看是相对较小的。用户通过操纵杆/按钮和机柜侧面的USB接口与该设备进行交互。在机柜的一侧似乎很少有关于USB端口的信息。请注意,即使在网站上的图片,也没有USB端口。但是,在机柜的一侧有一个USB设备端口,用于提供外部控制器支持。在另一边,我们有一个标准的耳机插孔。这两个外设的行为与预期的一样,USB端口可以用于连接外部控制器。

在一些老式的手机上,可以配置音频插孔以在启动时显示串行终端。关于这方面的更多信息可以在这里找到。不幸的是,在这个平台上没有这样的修改。

2.jpg

第一次查看这样的 PCB 时,我们首先要记下任何零件编号,看看是否能找到任何数据表。第一个让我印象深刻的组件用蓝色突出显示。

3.jpg

它是Rockchip RK3128,如果我们在网上搜索这个部件编号,我们会发现大量的相关信息。

中央处理器

四核 ARM Cortex-A7MP Core 处理器,一种高性能、低功耗和缓存的应用处理器;

完全实现ARM架构v7-A指令集,ARM Neon Advanced SIMD(单指令,多数据)支持加速媒体和信号处理计算;

图形处理器

ARM Mali400 MP2;

高性能 OpenGL ES1.1 和 2.0、OpenVG1.1 等;

内存

8 kb的内部存储器;

动态内存接口(DDR3/DDR3L/LPDDR2):兼容JEDEC标准DDR3-1066/DDR3L-1066/LPDDR2-800 SDRAM。支持32位数据宽度,2级(芯片选择),总共2GB(最大)地址空间。

Nand Flash接口:支持8位async/toggle/syncnandflash,最多4个bank。16位、24位、40位、60位硬件ECC;

eMMC接口:兼容标准eMMC接口,支持MMC4.5协议;

视频

MPEG-1, MPEG-2, MPEG-4,H.263, H.264, H.265, VC-1, VP8, MVC的实时视频解码器

音频

具有 8 个通道的 I2S/PCM:最多 8 个通道(8xTX、2xRX),从 16 位到 32 位的音频分辨率,采样率高达 192KHz。

具有 2个 通道的 I2S/PCM:最多 2 个通道(2xTX、2xRX),从 16 位到 32 位的音频分辨率,采样率高达 192KHz。

连接

SPI控制器:一个集成SPI控制器;

UART控制器:3个集成UART控制器;

I2C控制器:4个集成I2C控制器;

USB Host2.0:嵌入式1 USB Host 2.0 接口;

USB OTG2.0:兼容USB OTG2.0规范,支持高速(480Mbps)、全速(12Mbps)和低速(1.5Mbps)模式;

依据上述描述,我们就了解了很多关于目标处理器的信息。我们现在知道了架构和可用的外围设备和接口,这些对我们是有用的,因为它们可能概述未来的攻击向量。重要的是要记住,在逆向工程过程的这个阶段没有太多的信息。在尝试与目标进行交互之前,我们希望尽可能多地了解目标。

在CPU附近,我们有另一个以橙色突出显示的组件。

4.jpg

此组件标记为SEC931 K4B2G1646F-BYMA,我们很幸运,从三星在此网页中搜索此部件编号结果。本页上的信息告诉我们这是一个2GB DDR3 SDRAM芯片。一个数据表也可以从这个页面获得,收集可用的数据表总是值得的。该芯片负责将可用内存扩展到CPU,并提供一个易失性内存源(RAM)。

到目前为止,我们已经确定了哪些可能是主CPU和外部RAM。然而,我们仍然缺少一种非易失性存储。所以,接下来,让我们检查一下下面用粉色突出显示的组件。

5.jpg

此组件被标记为Winbond 25N01GVZEIG,搜索此部件编号将导致我们找到此数据表。这部分是一个1G-bit串行SLC NAND闪存芯片。根据数据表,该芯片采用串行外设接口,兼容的电压范围在2.6V到3.3V之间。该芯片可能包含机柜使用的大部分数据,并将成为我们提取固件的主要目标。

最后一个组件靠近GPIO线,标记为MIX2018A。这个组件不像我们看到的其他组件,我无法找到那么多的信息。然而,,该 IC 似乎是音频放大器。

回顾一下到目前为止我们已经确定的组件,有:

瑞芯微 RK3128 ARM CPU;

三星 SRAM 芯片;

华邦 1GBit NAND 闪存;

MIX2018A 音频放大器;

现在我们已经回顾了这块板上的集成电路,让我们看看板上的连接器,看看我们能学到什么。

连接器分析

现在我们已经记录了主板上的分立组件,我们将尝试识别主板上的外部连接器。首先,我们有桶形连接器;此连接器在下图中以蓝色标出:

6.jpg

该连接器用于为机柜供电

在桶形连接器的右侧,我们有一个微型 USB 端口。这应该立即引起人们的注意,原因有两个:

这不是一个面向用户的端口;

这不是 一个USB 主机端口,这是一个微型端口,表示 USB 设备或可能是 OTG(移动)控制器;

继续向右,我们有两行顶针。这些是通过早期图像中显示的灰色带状电缆连接的。该连接器连接到一个单独的控制板,用于处理操纵杆/按钮。

在我们的控制面板连接器之后,还有另一个四针连接器。有了这个连接器,它的方向就不那么明显了。例如,这个接口可以连接USB接口或耳机接口。我们可以用万用表的连续性测试来确定这一点。连续性测试将检查电流是否可以在两个探头之间流动,通常用以下符号在万用表上表示:

8.png

我们可以使用这个模型来测试两个组件是否连接,我把一根耳机线插入耳机插孔,把探针放在一个金属环上进行测试。用另一个探针,我触摸了四针连接器的每一个点,在其中一条线上,万用表发出了一声响亮的哔哔声,让我们知道这两点之间存在连接。三个引脚中的每一个都与音频连接器上的一个环相吻合,这是我们的音频接口!

接下来,我们有用于显示的连接器。

在显示屏附近,我们有两个两针连接器,一个在右下角,用于为字幕的背光供电,另一个用于金属外壳外部的开关。

11.jpg

下面的连接器看起来类似于音频连接器,它是一个四针连接器,其线缆可以连接到控制面板。只有一个接口我们还没有考虑,那就是在机柜的一侧的USB连接器。如果我们将万用表设置为连续模式,并将这个连接器的插脚与机柜侧面的USB连接器进行测试,我们发现它们确实是连接的,这是我们的外接USB接口。

我们已经确定了所有必须断开的连接,以便更好地查看电路板。因此,我们只剩下几件事情要检查。当检查PCB时,要寻找的一件事是任何未使用的测试焊盘或通孔。

如上图所示,我们可以看到我们有三组不同的未填充的标头或焊盘。在PCB的顶部,我们有三个通孔,通孔用于在PCB的多层之间进行连接。在检查嵌入式系统时,此类通孔通常是一个很好的起点,因为它们可能代表开发期间使用的调试头。

另一个未填充的是由16个焊盘组成,由一个白色矩形和一个小圆圈表示。这组焊盘可能是用于该板上不需要的另一个集成电路。

最后,最后一组焊盘看起来非常类似于用于USB和音频的连接器。当查看未使用的焊盘时,像这样的四脚连接通常是通过UART调试控制台的候选者,我们将在下一节中检查这些标头文件并讨论UART。

检查调试标头

在查看上一节中指出的未知标头时,我通常从测量电压开始。我们可以使用万用表来做到这一点。为了计算这些焊盘上的电压,我们将万用表设置为直流测量模式,并在将黑色探头放在接地点上的同时探测感兴趣的位置。引脚测量如下:

19.png

这些线路上没有电压,虽然这令人失望,但并不意外。如果这是一个有源 UART 或另一个正在传输的数字信号,我们会期望看到电压波动形式的一些活动。让我们继续讨论另一个三针接头。

20.png

当测量这个连接器时,我们的第二个引脚在启动时波动很大,然后稳定在 3.3V。

注意:在搜索串行端口时,你可能并不总是看到这种幅度的电压波动。波动与信号的活跃程度直接相关,这意味着如果流量很少,你将几乎看不到波动。如果你怀疑你有 UART 接头或某种数字接口,最好使用逻辑分析仪进行检查。

我们看到了可能看起来像信号活动的情况(基于电压波动)。接下来,我们将使用逻辑分析器检查此流量。逻辑分析仪帮助我们将这些电压波动转换为人类可读的 1 和 0 序列。为此,我们将使用母母跳线( female-female jumper wire)将我们的逻辑分析仪连接到我们的两个兴趣点,如下图所示:

22.jpg

分析仪连接后,我们将启动Pulseview,从下拉菜单中选择我们的分析仪,该设备在 pulseview 中显示为“Saleae Logic”设备。这个分析仪的最大捕获速率是24MHz,我们将使用它来进行分析。我们还需要指定样本数量,我已经将其设置为500G样本。

23.png

我们将通过点击运行启动捕获,然后使用这些设置启动机柜。

24.png

这样,我们就捕获了一些流量,在我们进一步讨论 pulseview 之前,让我们先介绍一下UART如何在信号级别上工作。我们已经确认有某种流量通过这些线路传输;接下来,我们需要了解更多关于 UART 流量以及如何分析它的知识。

UART

UART代表通用异步接收发送器,UART是一种允许两个设备通信的二线制异步串行协议。每一方所需的两条线路是传输(Tx)和接收(Rx)线路。UART可以用于嵌入式系统中的许多事情,包括与其他处理器通信、传感器通信和调试访问。UART是一种异步协议,意味着不需要时钟信号。相反,通信双方都预先配置为以一定的速度进行通信,称为波特率。波特率以每秒位数为单位。

UART报文/传输由以下字段组成:

25.png

即使有了上面的数据包定义,我们也很难确定我们的逻辑捕获的内容。幸运的是,Pulseview 有一个我们可以利用的 UART 解码器。

解码UART通信

使用 pulseview ,我们可以尝试解码这个通信,看看它是否确实是一个活动的UART。要设置解码器,请点击下面的绿色和黄色符号。这将打开解码器选择窗口,在搜索栏中输入uart,并选择uart解码器。

26.png

接下来,我们需要配置UART解码器。我们需要选择适当的频道并设置此解码器所需的任何协议特定参数。可配置参数如下:

27.png

首先,我们选择我们的 Rx 线路作为我们包含流量的通道;在我们的例子中,这将是 D1。对于所有其他字段,我们将保留它们的默认值、8 位数据宽度、无奇偶校验等。

有一件事我们需要自己调查和了解:波特率。请记住,双方必须提前就波特率达成一致,没有协商/启动顺序。我们需要自己确定波特率,否则,解码器将不知道如何正确地解析这些信号。要确定波特率,我们可以执行以下操作。

1.放大看起来是最小的脉冲之一;

2.使用Pulseview中的数据标记选择脉冲宽度,点击下面的按钮启用它们;

3.选择小脉冲范围后,Pulseview会自动计算频率并给出赫兹的测量值,如下图所示。

29.png

赫兹的周期是每秒,我们的波特率是每秒位数的度量。因此,如果我们突出显示了通过导线发送的一个位,以及这个脉冲的频率,我们也得到了波特率。

根据Pulseview,我们计算的频率是115.384 kHz,换算成波特率为115385位/秒。熟悉调试控制台的人可能会注意到,这非常接近常用的波特率115200。我们把这个值代入解码器,看看会发生什么。

如果我们查看下面的屏幕截图,可以看到拥有看似有效的调试日志。

30.png

我们有一个活跃的UART并且知道它的波特率,但是现在我们需要找到一种与它接口的方法。为此,我们将使用树莓派。更新后的机柜管脚如下:

31.jpg

配置树莓派

树莓派有多个UARTS可用,我们将使用的UART在下图中突出显示:

32.png

我们需要确保启用了适当的设备树blob来启用这个UART。设备树blob的目的是为内核提供一种方法来理解可用的硬件外围设备。内核将在启动时读取这些二进制信息,并枚举指定的外设。在对嵌入式Linux系统进行逆向工程时,提取这些信息是有益的,因为可以对这些信息进行反编译,并勾勒出各种外设在内存中的位置。

树莓派上所有相关的设备树 blob 都可以位于 /boot/overlays/ 中。在这个文件夹中,你会发现用于多种硬件配置的设备树二进制对象,一些用于特定的帽子(为Pi设计的定制pcb),可以连接到Pi,其他用于启用各种IO外围设备。我们可以使用raspi-config工具为UART外设启用适当的DTB。

本文翻译自:https://voidstarsec.com/blog//2022/01/27/uart-uboot-and-usb如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/j6jv
如有侵权请联系:admin#unsafe.sh