UART

Support HackTricks

基本情報

UARTはシリアルプロトコルであり、コンポーネント間でデータを1ビットずつ転送します。対照的に、並列通信プロトコルは複数のチャネルを通じてデータを同時に送信します。一般的なシリアルプロトコルには、RS-232、I2C、SPI、CAN、Ethernet、HDMI、PCI Express、およびUSBがあります。

一般的に、UARTがアイドル状態のとき、ラインは高い状態(論理1値)に保たれます。次に、データ転送の開始を示すために、送信者は受信者にスタートビットを送信し、その間、信号は低い状態(論理0値)に保たれます。次に、送信者は実際のメッセージを含む5〜8ビットのデータを送信し、オプションのパリティビットと1または2のストップビット(論理1値)を続けます。エラーチェックに使用されるパリティビットは、実際にはほとんど見られません。ストップビット(またはビット)は、送信の終了を示します。

最も一般的な構成を8N1と呼びます:8ビットのデータ、パリティなし、1つのストップビット。たとえば、Cという文字、またはASCIIで0x43を8N1 UART構成で送信したい場合、次のビットを送信します:0(スタートビット);0、1、0、0、0、0、1、1(0x43のバイナリ値)、および0(ストップビット)。

UARTと通信するためのハードウェアツール:

  • USB-to-serialアダプタ

  • CP2102またはPL2303チップを搭載したアダプタ

  • Bus Pirate、Adafruit FT232H、Shikra、またはAttify Badgeなどの多目的ツール

UARTポートの特定

UARTには4つのポートがあります:TX(送信)、RX(受信)、Vcc(電圧)、およびGND(接地)。PCBに**TXおよびRXの文字が書かれている4つのポートを見つけることができるかもしれません。しかし、表示がない場合は、マルチメーターやロジックアナライザー**を使用して自分で見つける必要があるかもしれません。

マルチメーターを使用し、デバイスの電源を切った状態で:

  • GNDピンを特定するには、連続性テストモードを使用し、バックリードを接地に置き、赤いリードでテストします。マルチメーターから音が聞こえるまで続けます。PCBには複数のGNDピンがあるため、UARTに属するものを見つけたかどうかはわかりません。

  • VCCポートを特定するには、DC電圧モードを設定し、20Vの電圧に設定します。黒いプローブを接地に、赤いプローブをピンに接続します。デバイスの電源を入れます。マルチメーターが3.3Vまたは5Vの一定の電圧を測定した場合、Vccピンを見つけたことになります。他の電圧が得られた場合は、他のポートで再試行します。

  • TX ポートを特定するには、DC電圧モードを20Vの電圧に設定し、黒いプローブを接地に、赤いプローブをピンに接続し、デバイスの電源を入れます。電圧が数秒間変動し、その後Vcc値で安定する場合、TXポートを見つけた可能性が高いです。これは、電源を入れるとデバッグデータが送信されるためです。

  • RXポートは他の3つに最も近く、電圧の変動が最も少なく、すべてのUARTピンの中で最も低い全体的な値を持っています。

TXポートとRXポートを混同しても何も起こりませんが、GNDポートとVCCポートを混同すると回路が壊れる可能性があります。

一部のターゲットデバイスでは、製造元によってRXまたはTX、または両方が無効にされている場合があります。その場合、回路基板内の接続を追跡し、ブレークアウトポイントを見つけることが役立ちます。UARTの検出が確認できず、回路が壊れていることを確認する強い手がかりは、デバイスの保証を確認することです。デバイスが保証付きで出荷されている場合、製造元はデバッグインターフェース(この場合はUART)を残しており、したがってUARTを切断し、デバッグ中に再接続する必要があります。これらのブレークアウトピンは、はんだ付けまたはジャンパーワイヤーで接続できます。

UARTボーレートの特定

正しいボーレートを特定する最も簡単な方法は、TXピンの出力を見てデータを読み取ることです。受信したデータが読み取れない場合は、次の可能なボーレートに切り替えて、データが読み取れるようになるまで続けます。これを行うには、USB-to-serialアダプタやBus Pirateのような多目的デバイスを使用し、baudrate.pyのようなヘルパースクリプトと組み合わせることができます。最も一般的なボーレートは9600、38400、19200、57600、および115200です。

このプロトコルでは、1つのデバイスのTXを他のデバイスのRXに接続する必要があることに注意してください!

CP210X UART to TTYアダプタ

CP210Xチップは、NodeMCU(esp8266搭載)などの多くのプロトタイピングボードでシリアル通信に使用されます。これらのアダプタは比較的安価で、ターゲットのUARTインターフェースに接続するために使用できます。デバイスには5つのピンがあります:5V、GND、RXD、TXD、3.3V。ターゲットがサポートする電圧に接続して、損傷を避けるようにしてください。最後に、アダプタのRXDピンをターゲットのTXDに、アダプタのTXDピンをターゲットのRXDに接続します。

アダプタが検出されない場合は、ホストシステムにCP210Xドライバがインストールされていることを確認してください。アダプタが検出されて接続されると、picocom、minicom、またはscreenなどのツールを使用できます。

Linux/MacOSシステムに接続されているデバイスをリストするには:

ls /dev/

UARTインターフェースとの基本的なインタラクションには、次のコマンドを使用します:

picocom /dev/<adapter> --baud <baudrate>

minicomの設定には、次のコマンドを使用します:

minicom -s

設定でボーレートやデバイス名をSerial port setupオプションで構成します。

構成後、minicomコマンドを使用してUARTコンソールを起動します。

Arduino UNO R3を介したUART(取り外し可能なAtmel 328pチップボード)

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インターフェースに応じてボーレートを設定します。

Bus Pirate

このシナリオでは、プログラムのすべての出力をシリアルモニターに送信しているArduinoのUART通信をスニッフィングします。

# Check the modes
UART>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. KEYB
9. LCD
10. PIC
11. DIO
x. exit(without change)

# Select UART
(1)>3
Set serial port speed: (bps)
1. 300
2. 1200
3. 2400
4. 4800
5. 9600
6. 19200
7. 38400
8. 57600
9. 115200
10. BRG raw value

# Select the speed the communication is occurring on (you BF all this until you find readable things)
# Or you could later use the macro (4) to try to find the speed
(1)>5
Data bits and parity:
1. 8, NONE *default
2. 8, EVEN
3. 8, ODD
4. 9, NONE

# From now on pulse enter for default
(1)>
Stop bits:
1. 1 *default
2. 2
(1)>
Receive polarity:
1. Idle 1 *default
2. Idle 0
(1)>
Select output type:
1. Open drain (H=Hi-Z, L=GND)
2. Normal (H=3.3V, L=GND)

(1)>
Clutch disengaged!!!
To finish setup, start up the power supplies with command 'W'
Ready

# Start
UART>W
POWER SUPPLIES ON
Clutch engaged!!!

# Use macro (2) to read the data of the bus (live monitor)
UART>(2)
Raw UART input
Any key to exit
Escritura inicial completada:
AAA Hi Dreg! AAA
waiting a few secs to repeat....

UARTコンソールを使用したファームウェアのダンプ

UARTコンソールは、ランタイム環境で基盤となるファームウェアを操作するための優れた方法を提供します。しかし、UARTコンソールのアクセスが読み取り専用の場合、多くの制約が生じる可能性があります。多くの組み込みデバイスでは、ファームウェアはEEPROMに保存され、揮発性メモリを持つプロセッサで実行されます。したがって、元のファームウェアが製造時にEEPROM自体にあるため、ファームウェアは読み取り専用のまま保持され、新しいファイルは揮発性メモリのために失われることになります。したがって、組み込みファームウェアを扱う際にファームウェアをダンプすることは貴重な努力です。

これを行う方法はたくさんあり、SPIセクションではさまざまなデバイスを使用してEEPROMから直接ファームウェアを抽出する方法を説明しています。ただし、物理デバイスや外部インタラクションを使用してファームウェアをダンプすることはリスクがあるため、最初にUARTを使用してファームウェアをダンプすることをお勧めします。

UARTコンソールからファームウェアをダンプするには、まずブートローダーにアクセスする必要があります。多くの人気ベンダーは、Linuxをロードするためのブートローダーとしてuboot(ユニバーサルブートローダー)を使用しています。したがって、ubootにアクセスすることが必要です。

ブートローダーにアクセスするには、UARTポートをコンピュータに接続し、任意のシリアルコンソールツールを使用し、デバイスへの電源供給を切断しておきます。セットアップが完了したら、Enterキーを押して保持します。最後に、デバイスに電源を接続し、ブートさせます。

これを行うと、ubootのロードが中断され、メニューが表示されます。ubootコマンドを理解し、ヘルプメニューを使用してそれらをリストすることをお勧めします。これがhelpコマンドである可能性があります。異なるベンダーが異なる構成を使用しているため、それぞれを個別に理解することが必要です。

通常、ファームウェアをダンプするためのコマンドは次のとおりです:

md

これは「メモリダンプ」を意味します。これにより、メモリ(EEPROMコンテンツ)が画面にダンプされます。メモリダンプをキャプチャするために、手順を開始する前にシリアルコンソールの出力をログに記録することをお勧めします。

最後に、ログファイルから不要なデータをすべて削除し、ファイルを filename.rom として保存し、binwalkを使用して内容を抽出します:

binwalk -e <filename.rom>

これは、16進数ファイルに見つかった署名に基づいて、EEPROMからの可能な内容をリストします。

ただし、使用されている場合でも、ubootが常にロック解除されているわけではないことに注意する必要があります。Enterキーが何も反応しない場合は、スペースキーなどの異なるキーを確認してください。ブートローダーがロックされていて中断されない場合、この方法は機能しません。デバイスのブートローダーがubootであるかどうかを確認するには、デバイスのブート中にUARTコンソールの出力を確認してください。ブート中にubootと表示されるかもしれません。

HackTricksをサポートする

Last updated