
UARTからRootへ: U-Boot経由でXiaomi C200に侵入
このリポジトリでは、露出したピン/テストパッドの一般的なセットがなくても、U-Bootとトリックを使って早期ステージでrootを取得し、最終的にファームウェアをダンプする方法を紹介します。
PCBから明らかな重要な点がいくつかあります。
最初に、簡単にUARTアクセスできるだろう明らかな候補を試しました。Tx、Rx、GND、電源と思われる4つのテストパッドが並んでいますが、写真のようにマルチメータでテストすると誤った読み取り値になりました。 他のほとんどのテストパッドも試しましたが、正しい読み取り値を見つけられなかったため、戦略を切り替える必要がありました。
ボード上には役立つコネクタもテストパッドも残っていないため、プロセッサのピンに直接接続してUARTシェルを取得する方法を取ることにしました。そのプロセッサのデータシートを調べ、UARTプロトコルのピンを特定しました。

次に、ボード上のグラウンドを見つけて接続するだけです。
このセットアップにはPCBiteプローブとUSB 2 TTLアダプタを使用しました。

それでは、picocom を使って目的のUARTシェルを取得できます。
sudo picocom -b 115200 /dev/ttyUSB0
何もしないと、ブートログが表示されるだけで、ブートプロセスの最後にはシェルが得られませんでした。そのため、すぐにEnterキーを押してU-Bootを中断する必要がありました。
U-Bootシェルを取得したら、まず環境変数(environment args)を表示しました。
重要なのは次の点です。
簡単にrootアクセスを得るには、setenv でinitコマンドを変更するテクニックを使えます。これによりlinuxrcバイナリを実行する代わりにシェルを取得できます。その後、メモリを手動でロードしてデバイスを起動します(実質的にbootcmdコマンドをコピーする形です)。
起動が完了すると、システム上では実質何も実行されていない初期シェルに入ります。そこで、元の linuxrc バイナリをバックグラウンドで実行し、このシステムで開いているポートを確認します。
残念ながらうまくいきませんでした。カメラはクラウドの「 47.237.75.249 」とのみ通信しており、いじれるような公開Webインターフェースはありません。
クラウド通信バイナリのリバースエンジニアリングは私の研究の範囲外なので、ここで研究を終了することにしました :)
ファームウェアをいじってみたい人へのおまけとして、その取得方法を紹介します。
前回と同じUARTセットアップですが、今回はブートせずに、フラッシュからRAMへのメモリのプローブとロードのみを行います。
その後、RAMメモリからデータを表示し、ターミナル出力を(今回は minicom で)記録してファイルに保存し、pythonで少し整形してファームウェアを取得します。binwalkとbootargsを照合すると、各セクションの名前を特定するのに役立ちます。
