はじめに
前回の記事でNANDの吸い出しをしました。そこで今回は吸い出したファームウェアを改変して見ようと思います。行っていることはcramfsの編集です。
URoad-Home関係の記事とその概要の一覧はこちら
やること
/etc/passwdを改変してパスワードを無効にする
改造ファームウェアの作成手順
この手順を踏むのは面倒だと思うので、完成したmodified-swapped.binをダウンロードできます。
1. 前回の記事で作成したextracted-swapped.binをマウントする
sudo mount -t cramfs extracted-swapped.bin 適当なマウントディレクトリ
みたいな感じで適当にマウントします。
2. マウントした物の中身をコピーする
適当なディレクトリを作ってコピーします。/dev下もコピーしないと行けないため、-fオプションを付けます。
sudo cp -f 適当なマウントディレクトリ 適当なディレクトリ
3. コピーした中から/etc/passwdを開く
vim 適当なディレクトリ/etc/passwd
4. /etc/passwdを変更する
元々はこんな感じです。binやdemonはroot権限はないですが、素のファームウェでもログイン可能です。
xとなっている部分がパスワードのハッシュ値が保存されている/etc/shadowを参考しているという意味なので、xをvimとかを使って消します。
5. cramfsを作成する
mkcramfs 適当なディレクトリ modified.bin
6. 作成したcramfsをビッグエンディアンに変換する
cramfsswap modified.bin modified-swapped.bin
これでファームウェア(modified-swapped.bin)は完成です。
元のファイルは20MBあり、作成されたファイルは9.6MBしかありませんが、その差は全部0で埋まっているだけなので、問題ありません。
書き込み
0. 事前準備
前々回の記事で行ったのと同じようにLAN周りの設定を行います。今回もtftpサーバはWindows上のC3Demonを使用していますが、LinuxやMacの場合はtftp-nowがおすすめです。
1. U-Bootのコンソールに入る
いつも通り連打します。checksum missmatchのループ時は、一回電源を切って、UARTを外して電源を入れて、しばらくしたらUARTに入ってリセットボタンを押してキーボードを連打すればU-Bootに入れます。
2. TFTPで転送
tftpboot 0x81000000 modified-swapped.bin
tftpでURoad-Home 2+に転送を行います。
3. NANDをerase
ミスると起動しなくなったりすると注意!
今回の作成したファームウェアは
nand erase 0x600000 0x1400000
4. NANDに焼く
nand write 0x81000000 0x600000 0x1400000
tftpの転送のログの最後の方を見るとBytes transferred = 10043392 (994000 hex)と書いてあるので、このhexの方の値を書き込むサイズに採用します。99400の部分は改造した内容によって異なってくると思います。
nand write 0x81000000 0x600000 0x994000
5. 再起動
reset
ログイン
rootでログインできます。これで晴れて色々いじれます。
ログインしてみての考察
とりあえずtelnetが使用できます。telnetdで起動できます。
nvコマンドが存在しており、nv -pとかでnvramの中身を見ることができます。見ては行けないようなログインユーザの存在が確認できます。
/etc/All_Dump.shがあってこれを実行すればNANDのダンプを自動で取ってくれてtftp経由でアップロードしてくれるっぽいです。
ip aの実行結果はこんな感じです。やたらとインターフェイスが多いです。br0はeth0とeth1のあぢあだと思います。eth2はWiMAXモジュールのものです。ath0とath1はなんですかねぇWiFiの仮想インターフェイスとかなんですかねぇ
/proc/mtdの結果をまとめたところこんな感じです。
dev: size erasesize name offset size
mtd0: 00080000 00020000 “u-boot” 0 512k
mtd1: 00080000 00020000 “u-boot-env” 80000 512k
mtd2: 00100000 00020000 “reserve0” 100000 1m
mtd3: 00400000 00020000 “linux” 200000 4m
mtd4: 01400000 00020000 “rootfs” 600000 20m
mtd5: 00400000 00020000 “linux2” 1A00000 4m
mtd6: 01400000 00020000 “rootfs2” 1E00000 20m
mtd7: 00100000 00020000 “nvparam” 3200000 1m
mtd8: 00100000 00020000 “nvparam2” 3300000 1m
mtd9: 01800000 00020000 “update” 3400000 24m
mtd10: 00100000 00020000 “caldata” 4C00000 1m
mtd11: 00100000 00020000 “reserve1” 4D00000 1m
mtd12: 00400000 00020000 “linux3” 4E00000 4m
mtd13: 01400000 00020000 “rootfs3” 5200000 20m
GPIO周りは、gpioappというコマンドが入っていて、それで、入出力設定、High/Low設定ができるっぽいです。解析結果はこんな感じでした。変更するとフリーズするものがちょくちょくありました。電源は多分別で電源スイッチと直結してます。
4・・・resetボタン(0で押される)
16・・・WPSボタン(0で押される)
11・・・WiFiの青LEDのON(0)/OFF(1)
17・・・WiFiの緑LEDのON(0)/OFF(1)
18・・・USB(WiMAXモジュール)の電源ON(1)/OFF(0)
19・・・LAN2のLEDのON(0)/OFF(1)
20・・・LAN1のLEDのON(0)/OFF(1)
21、22・・・LEDが実装されていない下側2つのGPIO?
終わりに
とりあえず色々できたので面白かったです。本格的にリバースエンジニアリングになってきました。USBを増設したりしてみたいです。GPIOの関係も掴めたので、ラジコンもできそうですね。次回はOpenWRTのインストールですかね
URoad-Home関係の記事の一覧と概要はこちら