きっかけ
このシリーズ久しぶりです。大学のゴミ捨て場からXilinxのパラレルポート↔JTAG変換器をもらってきたのがきっかけになりました。ただ、もらってきたやつは動作が微妙だったので友達からJ-Link Compactを借りました。また、セキュリティ・キャンプでJTAGを使いまくるっぽいのでその予習も兼ねてます。
前回はOpenWRTの起動までしましたが、ビルドして、NANDに焼く前にファームウェアをダンプしておきます。何かあったときに戻せるようにしておくためです。
【追記】この記事より簡単な方法で特殊な機器無しでファームウェアをダンプできます。
URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取とファームウェアダンプ~
URoad-Home関係の記事の一覧と概要はこちら
JTAGポートのピン配置
URoad-Home2+を分解してみたで書きましたが基板左上あたりにUARTと並んでJTAGのポートがあります。それを使用します。ピンヘッダは適当に立てました。ピン配置は標準的なMIPSのものです。このページを参考にしました。
J-Linkと接続
J-Link Compactのピンアサインはこんな感じなので、適当に接続します。
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にすると、早すぎてついてこれないのか、接続できなくなります。
その後、他のウィンドウ(セッション)で
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で調べてみるとこんな感じでした。
カーネルと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/
とかでインストールしてください。まあ、これを入れてもほとんど展開されないんですけどね