URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~

投稿者: | 2月 7, 2024

きっかけ

このシリーズ久しぶりです。大学のゴミ捨て場からXilinxのパラレルポート↔JTAG変換器をもらってきたのがきっかけになりました。ただ、もらってきたやつは動作が微妙だったので友達からJ-Link Compactを借りました。また、セキュリティ・キャンプでJTAGを使いまくるっぽいのでその予習も兼ねてます。
前回はOpenWRTの起動までしましたが、ビルドして、NANDに焼く前にファームウェアをダンプしておきます。何かあったときに戻せるようにしておくためです。

【追記】この記事より簡単な方法で特殊な機器無しでファームウェアをダンプできます。
URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取とファームウェアダンプ~

URoad-Home関係の記事の一覧と概要はこちら

URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
XILINX
Parallel Cabele IV
パラレルポート JTAG
XILINX Parallel Cable IV DLC7
URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
J-Link compact
SEGGER
友人から借りたJ-Link Compact

JTAGポートのピン配置

URoad-Home2+を分解してみたで書きましたが基板左上あたりにUARTと並んでJTAGのポートがあります。それを使用します。ピンヘッダは適当に立てました。ピン配置は標準的なMIPSのものです。このページを参考にしました。

URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
JTAG ピンアサイン
URoad-TEC100 Rev1.1 2014/02/21
JTAGのピンアサイン

J-Linkと接続

J-Link Compactのピンアサインはこんな感じなので、適当に接続します。

J-Link
ピンアサイン
URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
J-Linkのピンアサイン
URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
J-Link Compact SEGGER
ダンプ NAND
J-Linkを接続したところ

OpenOCDでの接続

PCはUbuntu 22.04で実行しました。
OpenOCDをapt install openocdとかでインストールします。J-LinkをPCと接続します。使用されているSoC(AR9344)用のターゲットファイルが必要なので、ここらへんからダウンロードします。ダウンロードしたatheros_ar9344.cfgのディレクトリ上で

sudo openocd -s ./ -f jlink.cfg -f atheros_ar9344.cfg -c "adapter speed 10000"

を実行してJTAGの接続を行います。問題がなければinfoだけが出ると思います。adapter speed 15000にすると、早すぎてついてこれないのか、接続できなくなります。

URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
OpenOCD
OpenOCDでJTAG接続したところ

その後、他のウィンドウ(セッション)で

telnet localhost 4444

を実行してOpenOCDのコマンドラインにアクセスします。これで接続は完了です。

NANDをダンプ

OpenOCDから直接ダンプできればよかったのですが、NANDへのアクセス方法が分からなかったので、URoad-Home 2+上のU-Bootでnand readを用いてメモリにコピーし、それをOpenOCDでダンプすることにしました。NANDが128MBでメモリも128MBなので、2回に分けてダンプしました。

UARTを接続し、キーを押しながらリセットボタンを押してU-Bootのコンソールに入ります。

nand read 0x81000000 0x0 0x4000000

でNANDの0番地から64MB(4000000)をメモリの0x81000000から設置します。その後、OpenOCD上で

halt

でSoCを停止させて、

dump_image dump1.bin 0x81000000 0x4000000

を実行して、ダンプを行います。そこそこ時間がかかりました。
これが終わったら、URoad-Home 2+の電源を入れ直して再びU-Bootに入って、

nand read 0x81000000 0x4000000 0x4000000

を使って残りの64MBをメモリにコピーします。その後、OpenOCDで同じ様に

sudo openocd -s ./ -f jlink.cfg -f atheros_ar9344.cfg -c "adapter speed 10000"
telnet localhost 4444
halt
dump_image dump2.bin 0x81000000 0x4000000

を実行します。このままだとファイルが2つに別れてしまっているので、Linuxのコンソール上で

cp dump1.bin dump.bin
dd if=dump2.bin of=dump.bin oflag=append conv=notrunc

で結合します。これでdump.binという1つのファイルになります。

解析

binwalk dump.binで調べてみるとこんな感じでした。

URoad-Home2+を分解してみた4~JTAGでファームウェアダンプ~
binwalk NAND ダンプ
binwalkで中身を見たところ

カーネルとCramFSのセットが3つはいっていることがわかります。これは、U-Bootのprintenvから把握できる内容と一致しています。binwalk -eM dump.binで展開したかったんですが、上手く行かなかったので、

dd if=dump.bin of=extracted.bin bs=1 skip=6291456 count=20971520

で1つ目のCramFSのバイナリファイルを取り出します。このファイルはビックエディアンになっているので、

cramfsswap extracted.bin extracted-swapped.bin

でextracted-swapped.binというファイル名でリトルエンディアンに変換します。あとは、適当なところに

sudo mount -t cramfs extracted-swapped.bin /mnt/kari

とかでマウントして中身を見ることができます。

おわりに

JTAGでのダンプに1日以上かかるのでかなり大変でした。まちがえて触れてしまってやり直しとかあって2日はかかりました。次回はダンプしたファームウェアを改変してrootパスワードを吹き飛ばしてrootにログインしてみようと思います。

URoad-Home関係の記事の一覧と概要はこちら

おまけ(cramfsck、mkcramfs)

binwalkで展開しようとしよとするとcramfsckがなくてエラーが出て全然展開されなかったので、その場合は

git clone https://github.com/npitre/cramfs-tools.git
cd cramfs-tools
make
cp
sudo cp cramfsck /usr/bin/
sudo cp mkcramfs /usr/bin/

とかでインストールしてください。まあ、これを入れてもほとんど展開されないんですけどね

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)