UART
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
UART 是一种串行协议,这意味着它一次传输一个比特的数据。相比之下,平行通信协议通过多个通道同时传输数据。常见的串行协议包括 RS-232、I2C、SPI、CAN、以太网、HDMI、PCI Express 和 USB。
通常,在 UART 处于空闲状态时,线路保持高电平(逻辑 1 值)。然后,为了表示数据传输的开始,发射器向接收器发送一个起始位,此时信号保持低电平(逻辑 0 值)。接下来,发射器发送五到八个数据位,包含实际消息,后面跟着一个可选的奇偶校验位和一个或两个停止位(逻辑 1 值),具体取决于配置。用于错误检查的奇偶校验位在实际中很少见。停止位(或位)表示传输结束。
我们称最常见的配置为 8N1:八个数据位,无奇偶校验和一个停止位。例如,如果我们想在 8N1 UART 配置中发送字符 C,或 0x43 的 ASCII 码,我们将发送以下位:0(起始位);0,1,0,0,0,0,1,1(0x43 的二进制值),和 0(停止位)。
与 UART 通信的硬件工具:
USB 转串口适配器
带有 CP2102 或 PL2303 芯片的适配器
多功能工具,如:Bus Pirate、Adafruit FT232H、Shikra 或 Attify Badge
UART 有 4 个端口:TX(发送)、RX(接收)、Vcc(电压)和 GND(接地)。你可能会在 PCB 上找到带有 TX
和 RX
字母的 4 个端口。但如果没有指示,你可能需要使用 万用表 或 逻辑分析仪 自行寻找它们。
使用 万用表 并关闭设备电源:
要识别 GND 引脚,使用 连续性测试 模式,将黑色引线放入接地,使用红色引线测试,直到你听到万用表发出声音。PCB 上可能会找到多个 GND 引脚,因此你可能找到的并不一定是属于 UART 的。
要识别 VCC 端口,设置 直流电压模式,并将其设置为 20 V 电压。黑色探头接地,红色探头接引脚。打开设备电源。如果万用表测得恒定电压为 3.3 V 或 5 V,则你找到了 Vcc 引脚。如果测得其他电压,请尝试其他端口。
要识别 TX 端口,将 直流电压模式 设置为 20 V,黑色探头接地,红色探头接引脚,打开设备电源。如果你发现电压在几秒钟内波动,然后稳定在 Vcc 值,则你很可能找到了 TX 端口。这是因为在开机时,它会发送一些调试数据。
RX 端口 是与其他 3 个端口最接近的,它的电压波动最低,所有 UART 引脚中整体值最低。
你可以混淆 TX 和 RX 端口,没什么问题,但如果混淆 GND 和 VCC 端口,你可能会烧毁电路。
在某些目标设备中,制造商通过禁用 RX 或 TX 或甚至两者来禁用 UART 端口。在这种情况下,追踪电路板中的连接并找到一些断点可能会有所帮助。确认没有检测到 UART 和电路断开的一个强烈提示是检查设备保修。如果设备附带某些保修,制造商会留下某些调试接口(在这种情况下是 UART),因此,必须断开 UART,并在调试时重新连接。这些断点引脚可以通过焊接或跳线连接。
识别正确波特率的最简单方法是查看 TX 引脚的输出并尝试读取数据。如果你收到的数据不可读,请切换到下一个可能的波特率,直到数据变得可读。你可以使用 USB 转串口适配器或像 Bus Pirate 这样的多功能设备来做到这一点,并配合一个辅助脚本,例如 baudrate.py。最常见的波特率为 9600、38400、19200、57600 和 115200。
需要注意的是,在此协议中,你需要将一个设备的 TX 连接到另一个设备的 RX!
CP210X 芯片广泛用于许多原型板,如 NodeMCU(带 esp8266)进行串行通信。这些适配器相对便宜,可以用于连接目标的 UART 接口。该设备有 5 个引脚:5V、GND、RXD、TXD、3.3V。确保将电压连接为目标所支持的,以避免任何损坏。最后,将适配器的 RXD 引脚连接到目标的 TXD,引脚连接适配器的 TXD 引脚到目标的 RXD。
如果适配器未被检测到,请确保主机系统中已安装 CP210X 驱动程序。一旦适配器被检测到并连接,可以使用 picocom、minicom 或 screen 等工具。
要列出连接到 Linux/MacOS 系统的设备:
对于与UART接口的基本交互,请使用以下命令:
对于minicom,使用以下命令进行配置:
配置 Serial port setup
选项中的波特率和设备名称。
配置完成后,使用命令 minicom
启动 UART 控制台。
如果没有 UART 串行到 USB 适配器,可以使用 Arduino UNO R3 进行快速破解。由于 Arduino UNO R3 通常随处可用,这可以节省很多时间。
Arduino UNO R3 板上内置了 USB 到串行适配器。要获取 UART 连接,只需将 Atmel 328p 微控制器芯片从板上拔出。此破解适用于 Atmel 328p 未焊接在板上的 Arduino UNO R3 变体(使用的是 SMD 版本)。将 Arduino 的 RX 引脚(数字引脚 0)连接到 UART 接口的 TX 引脚,将 Arduino 的 TX 引脚(数字引脚 1)连接到 UART 接口的 RX 引脚。
最后,建议使用 Arduino IDE 获取串行控制台。在菜单的 tools
部分,选择 Serial Console
选项,并根据 UART 接口设置波特率。
在这种情况下,我们将嗅探 Arduino 的 UART 通信,该通信将程序的所有打印信息发送到串行监视器。
UART Console 提供了一种在运行时环境中处理底层固件的好方法。但是,当 UART Console 访问是只读时,它可能会引入许多限制。在许多嵌入式设备中,固件存储在 EEPROM 中,并在具有易失性内存的处理器中执行。因此,固件保持只读状态,因为制造时的原始固件就在 EEPROM 内部,任何新文件都将由于易失性内存而丢失。因此,在处理嵌入式固件时,转储固件是一项有价值的工作。
有很多方法可以做到这一点,SPI 部分涵盖了使用各种设备直接从 EEPROM 中提取固件的方法。尽管如此,建议首先尝试使用 UART 转储固件,因为使用物理设备和外部交互转储固件可能存在风险。
从 UART Console 转储固件首先需要获取对引导加载程序的访问权限。许多流行的供应商使用 uboot(通用引导加载程序)作为其引导加载程序来加载 Linux。因此,获取对 uboot 的访问权限是必要的。
要访问引导加载程序,请将 UART 端口连接到计算机,并使用任何串行控制台工具,并保持设备的电源断开。一旦设置完成,按下 Enter 键并保持不放。最后,连接设备的电源并让其启动。
这样做将中断 uboot 的加载并提供一个菜单。建议了解 uboot 命令并使用帮助菜单列出它们。这可能是 help
命令。由于不同的供应商使用不同的配置,因此有必要分别理解每个配置。
通常,转储固件的命令是:
这代表“内存转储”。这将把内存(EEPROM 内容)转储到屏幕上。建议在开始程序之前记录串行控制台输出,以捕获内存转储。
最后,只需从日志文件中剥离所有不必要的数据,并将文件存储为 filename.rom
,然后使用 binwalk 提取内容:
这将根据在十六进制文件中找到的签名列出 EEPROM 的可能内容。
尽管需要注意的是,即使正在使用 uboot,uboot 并不总是解锁的。如果 Enter 键没有任何反应,请检查其他键,如空格键等。如果引导加载程序被锁定且没有被中断,则此方法将无效。要检查 uboot 是否是设备的引导加载程序,请在设备启动时检查 UART 控制台上的输出。它可能在启动时提到 uboot。
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE) 学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)