这篇文章将以Arcade 1UP Marvel 街机为目标,重点介绍 UART、UBoot 和 USB。 Arcade1UP系列街机自从推出以来,已经有很多玩家在研究如何更换机柜的内部组件来运行通用 MAME 软件。这篇文章将着眼于现有的硬件,并讨论如何提取固件。
在这篇文章,我们将介绍以下内容:
1.拆卸现有嵌入式系统的支撑硬件;
2.通过 IC 标记识别组件;
3.用万用表测量连接器电压;
4.逻辑分析仪的使用和设置;
5.UBoot分析和审查;
6.使用 depthcharge 编写 UBoot 交互脚本;
这篇文章旨在介绍在目标系统上定位活动的 UART、如何接近 UBoot 控制台以及最终如何利用这两个组件从我们的目标中提取闪存。阅读本文后,你将熟悉屏幕实用程序depthcharge python3库。
硬件概述
在查看新目标时,首要任务之一是检查可用的接口。在这个街机柜的例子中,可用的接口乍一看是相对较小的。用户通过操纵杆/按钮和机柜侧面的USB接口与该设备进行交互。在机柜的一侧似乎很少有关于USB端口的信息。请注意,即使在网站上的图片,也没有USB端口。但是,在机柜的一侧有一个USB设备端口,用于提供外部控制器支持。在另一边,我们有一个标准的耳机插孔。这两个外设的行为与预期的一样,USB端口可以用于连接外部控制器。
在一些老式的手机上,可以配置音频插孔以在启动时显示串行终端。关于这方面的更多信息可以在这里找到。不幸的是,在这个平台上没有这样的修改。
第一次查看这样的 PCB 时,我们首先要记下任何零件编号,看看是否能找到任何数据表。第一个让我印象深刻的组件用蓝色突出显示。
它是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附近,我们有另一个以橙色突出显示的组件。
此组件标记为SEC931 K4B2G1646F-BYMA,我们很幸运,从三星在此网页中搜索此部件编号结果。本页上的信息告诉我们这是一个2GB DDR3 SDRAM芯片。一个数据表也可以从这个页面获得,收集可用的数据表总是值得的。该芯片负责将可用内存扩展到CPU,并提供一个易失性内存源(RAM)。
到目前为止,我们已经确定了哪些可能是主CPU和外部RAM。然而,我们仍然缺少一种非易失性存储。所以,接下来,让我们检查一下下面用粉色突出显示的组件。
此组件被标记为Winbond 25N01GVZEIG,搜索此部件编号将导致我们找到此数据表。这部分是一个1G-bit串行SLC NAND闪存芯片。根据数据表,该芯片采用串行外设接口,兼容的电压范围在2.6V到3.3V之间。该芯片可能包含机柜使用的大部分数据,并将成为我们提取固件的主要目标。
最后一个组件靠近GPIO线,标记为MIX2018A。这个组件不像我们看到的其他组件,我无法找到那么多的信息。然而,,该 IC 似乎是音频放大器。
回顾一下到目前为止我们已经确定的组件,有:
瑞芯微 RK3128 ARM CPU;
三星 SRAM 芯片;
华邦 1GBit NAND 闪存;
MIX2018A 音频放大器;
现在我们已经回顾了这块板上的集成电路,让我们看看板上的连接器,看看我们能学到什么。
连接器分析
现在我们已经记录了主板上的分立组件,我们将尝试识别主板上的外部连接器。首先,我们有桶形连接器;此连接器在下图中以蓝色标出:
该连接器用于为机柜供电
在桶形连接器的右侧,我们有一个微型 USB 端口。这应该立即引起人们的注意,原因有两个:
这不是一个面向用户的端口;
这不是 一个USB 主机端口,这是一个微型端口,表示 USB 设备或可能是 OTG(移动)控制器;
继续向右,我们有两行顶针。这些是通过早期图像中显示的灰色带状电缆连接的。该连接器连接到一个单独的控制板,用于处理操纵杆/按钮。
在我们的控制面板连接器之后,还有另一个四针连接器。有了这个连接器,它的方向就不那么明显了。例如,这个接口可以连接USB接口或耳机接口。我们可以用万用表的连续性测试来确定这一点。连续性测试将检查电流是否可以在两个探头之间流动,通常用以下符号在万用表上表示:
我们可以使用这个模型来测试两个组件是否连接,我把一根耳机线插入耳机插孔,把探针放在一个金属环上进行测试。用另一个探针,我触摸了四针连接器的每一个点,在其中一条线上,万用表发出了一声响亮的哔哔声,让我们知道这两点之间存在连接。三个引脚中的每一个都与音频连接器上的一个环相吻合,这是我们的音频接口!
接下来,我们有用于显示的连接器。
在显示屏附近,我们有两个两针连接器,一个在右下角,用于为字幕的背光供电,另一个用于金属外壳外部的开关。
下面的连接器看起来类似于音频连接器,它是一个四针连接器,其线缆可以连接到控制面板。只有一个接口我们还没有考虑,那就是在机柜的一侧的USB连接器。如果我们将万用表设置为连续模式,并将这个连接器的插脚与机柜侧面的USB连接器进行测试,我们发现它们确实是连接的,这是我们的外接USB接口。
我们已经确定了所有必须断开的连接,以便更好地查看电路板。因此,我们只剩下几件事情要检查。当检查PCB时,要寻找的一件事是任何未使用的测试焊盘或通孔。
如上图所示,我们可以看到我们有三组不同的未填充的标头或焊盘。在PCB的顶部,我们有三个通孔,通孔用于在PCB的多层之间进行连接。在检查嵌入式系统时,此类通孔通常是一个很好的起点,因为它们可能代表开发期间使用的调试头。
另一个未填充的是由16个焊盘组成,由一个白色矩形和一个小圆圈表示。这组焊盘可能是用于该板上不需要的另一个集成电路。
最后,最后一组焊盘看起来非常类似于用于USB和音频的连接器。当查看未使用的焊盘时,像这样的四脚连接通常是通过UART调试控制台的候选者,我们将在下一节中检查这些标头文件并讨论UART。
检查调试标头
在查看上一节中指出的未知标头时,我通常从测量电压开始。我们可以使用万用表来做到这一点。为了计算这些焊盘上的电压,我们将万用表设置为直流测量模式,并在将黑色探头放在接地点上的同时探测感兴趣的位置。引脚测量如下:
这些线路上没有电压,虽然这令人失望,但并不意外。如果这是一个有源 UART 或另一个正在传输的数字信号,我们会期望看到电压波动形式的一些活动。让我们继续讨论另一个三针接头。
当测量这个连接器时,我们的第二个引脚在启动时波动很大,然后稳定在 3.3V。
注意:在搜索串行端口时,你可能并不总是看到这种幅度的电压波动。波动与信号的活跃程度直接相关,这意味着如果流量很少,你将几乎看不到波动。如果你怀疑你有 UART 接头或某种数字接口,最好使用逻辑分析仪进行检查。
我们看到了可能看起来像信号活动的情况(基于电压波动)。接下来,我们将使用逻辑分析器检查此流量。逻辑分析仪帮助我们将这些电压波动转换为人类可读的 1 和 0 序列。为此,我们将使用母母跳线( female-female jumper wire)将我们的逻辑分析仪连接到我们的两个兴趣点,如下图所示:
分析仪连接后,我们将启动Pulseview,从下拉菜单中选择我们的分析仪,该设备在 pulseview 中显示为“Saleae Logic”设备。这个分析仪的最大捕获速率是24MHz,我们将使用它来进行分析。我们还需要指定样本数量,我已经将其设置为500G样本。
我们将通过点击运行启动捕获,然后使用这些设置启动机柜。
这样,我们就捕获了一些流量,在我们进一步讨论 pulseview 之前,让我们先介绍一下UART如何在信号级别上工作。我们已经确认有某种流量通过这些线路传输;接下来,我们需要了解更多关于 UART 流量以及如何分析它的知识。
UART
UART代表通用异步接收发送器,UART是一种允许两个设备通信的二线制异步串行协议。每一方所需的两条线路是传输(Tx)和接收(Rx)线路。UART可以用于嵌入式系统中的许多事情,包括与其他处理器通信、传感器通信和调试访问。UART是一种异步协议,意味着不需要时钟信号。相反,通信双方都预先配置为以一定的速度进行通信,称为波特率。波特率以每秒位数为单位。
UART报文/传输由以下字段组成:
即使有了上面的数据包定义,我们也很难确定我们的逻辑捕获的内容。幸运的是,Pulseview 有一个我们可以利用的 UART 解码器。
解码UART通信
使用 pulseview ,我们可以尝试解码这个通信,看看它是否确实是一个活动的UART。要设置解码器,请点击下面的绿色和黄色符号。这将打开解码器选择窗口,在搜索栏中输入uart,并选择uart解码器。
接下来,我们需要配置UART解码器。我们需要选择适当的频道并设置此解码器所需的任何协议特定参数。可配置参数如下:
首先,我们选择我们的 Rx 线路作为我们包含流量的通道;在我们的例子中,这将是 D1。对于所有其他字段,我们将保留它们的默认值、8 位数据宽度、无奇偶校验等。
有一件事我们需要自己调查和了解:波特率。请记住,双方必须提前就波特率达成一致,没有协商/启动顺序。我们需要自己确定波特率,否则,解码器将不知道如何正确地解析这些信号。要确定波特率,我们可以执行以下操作。
1.放大看起来是最小的脉冲之一;
2.使用Pulseview中的数据标记选择脉冲宽度,点击下面的按钮启用它们;
3.选择小脉冲范围后,Pulseview会自动计算频率并给出赫兹的测量值,如下图所示。
赫兹的周期是每秒,我们的波特率是每秒位数的度量。因此,如果我们突出显示了通过导线发送的一个位,以及这个脉冲的频率,我们也得到了波特率。
根据Pulseview,我们计算的频率是115.384 kHz,换算成波特率为115385位/秒。熟悉调试控制台的人可能会注意到,这非常接近常用的波特率115200。我们把这个值代入解码器,看看会发生什么。
如果我们查看下面的屏幕截图,可以看到拥有看似有效的调试日志。
我们有一个活跃的UART并且知道它的波特率,但是现在我们需要找到一种与它接口的方法。为此,我们将使用树莓派。更新后的机柜管脚如下:
配置树莓派
树莓派有多个UARTS可用,我们将使用的UART在下图中突出显示:
我们需要确保启用了适当的设备树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如若转载,请注明原文地址