レトロフリークで任意のコマンドをroot権限で実行する その1
そこで、まずはとレトロフリークのお兄さん的なRetroN 5のhack状況を調べてみたところ、既にいろいろと進んでおり、標準では対応していないエミュレータ等も動いているようです。おぉすごい。
ただ残念ながらclosedな環境で配布等されているようで、あまり情報が表に出てきていないようです。
しかし全然全く情報がない訳でもなく、RetroN 5 Factory Reset Instructions を解析してroot化がなされ、さらにそこから解析されていった模様で、レトロフリーク用のfactory imageが公開されれば、同じようにroot化できるなーと思いつつ、予習としてRetroN 5のfactory imageの解析を細々と進めていました。
その過程で、レトロフリークにてroot権限で任意のコマンドを実行できることを発見しましたので、解析した足跡を振り返りつつまとめてみたいと思います。
普段はMac使いなひっそりぃですが、ext3とかext4とかmountするので以下作業はUbuntu Linuxにて行っています。
まずはboot-recovery-SD-fullreset-v0.2.2.zipを解凍し、出てきたimgファイルをfileコマンドで中身を確認してみました。
いくつかのpartitionに分かれていること、それぞれのstartsectorが確認できます。
先頭にboot sector、partition 1がFAT、partition 2とpartition 3がext4でした。
hissorii@ubuntu:~$ file -k boot-recovery-SD-fullreset-v0.2.2.img
boot-recovery-SD-fullreset-v0.2.2.img: x86 boot sector; partition 1: ID=0xb, starthead 32, startsector 2048, 348160 sectors; partition 2: ID=0x83, starthead 0, startsector 353430, 16065 sectors; partition 3: ID=0x83, starthead 0, startsector 369495, 16065 sectors
それぞれのpartitionをmountします。
hissorii@ubuntu:~$ sudo mkdir /mnt/tmp{1,2,3}
hissorii@ubuntu:~$ sudo mount boot-recovery-SD-fullreset-v0.2.2.img /mnt/tmp1 -o offset=$((2048*512)) -o loop -t vfat
hissorii@ubuntu:~$ sudo mount boot-recovery-SD-fullreset-v0.2.2.img /mnt/tmp2 -o offset=$((353430*512)) -o loop -t ext4
hissorii@ubuntu:~$ sudo mount boot-recovery-SD-fullreset-v0.2.2.img /mnt/tmp3 -o offset=$((369495*512)) -o loop -t ext4
それぞれ中身を確認。まずはpartition 2。
hissorii@ubuntu:~$ ls -F /mnt/tmp2/
app/ bootscript.sh* dontpanic/ lost+found/ property/
app-asec/ dalvik-cache/ drm/ media/ resource-cache/
app-private/ data/ local/ misc/ ssh/
ほとんど空のディレクトリばかりだが、bootscript.shがroot権限でのコマンド実行に重要な役割を果たします。これは後程。
partition 3はlost+foundディレクトリのみでした。
hissorii@ubuntu:~$ ls -F /mnt/tmp3/
lost+found/
最後にFAT領域。
hissorii@ubuntu:~$ ls -l /mnt/tmp1/
total 149130
-rwxr-xr-x 1 root root 152708368 Jun 5 2014 update.img
このupdate.imgは、RetroN 5の独自フォーマットではなく、RockChipで普通に使われている形式のようで、ここら辺のツールで展開できます。
hissorii@ubuntu:~$ unzip imgRePackerRK_105.zip
Archive: imgRePackerRK_105.zip
inflating: imgrepackerrk
inflating: imgRePackerRK.exe
inflating: ReadMe.txt
inflating: zlib1.dll
hissorii@ubuntu:~$ chmod u+x imgrepackerrk
hissorii@ubuntu:~$ cp -p /mnt/tmp1/update.img .
hissorii@ubuntu:~$ ./imgrepackerrk update.img
imgrepackerrk (version 1.05 linux)
Rockchip firmware batch/update images unpacker/packer
(c) RedScorpio, Moscow, 2013-2015
RedScorpio@land.ru
==========================[ START ]==========================
--- Firmware unpacking ---
"RKFW" image file detected
Batch image header from "update.img" was read
Image properties:
Type RockChip batch image (RKFW)
Version 4.0.4
Date 2014.06.05
Time 13:15:12
ChipID 0x00000060
Code(?) 0x01050000
-- boot.img processing --
-- update.img processing --
Update data header from "update.img" was read
Image properties:
Type RockChip update image (RKAF)
Id "007"
Model "Retron5"
Manufacturer "Datapower"
Version 4.0.4
- Files extracting -
Image files count = 8
package-file (package-file) extracted (format: unknown)
parameter (parameter.parm) extracted (format: RockChip PARM signed file)
"update.img.dump/parameter" extracted
misc (Image/misc.img) extracted (format: unknown)
boot (Image/boot.img) extracted (format: Android boot image)
recovery (Image/recovery.img) extracted (format: Android boot image)
system (Image/system.img) extracted (format: ext3 image)
backup (RESERVED) skipped
update-script (update-script) extracted (format: unknown)
- rkCRC summ of update.img checking -
Stored rkCRC = 0x08e994e7
Calculated rkCRC = 0x08e994e7
Configuration file for RKAndroidTool v.1.xx (8-bit) created
Configuration file for RKAndroidTool v.2.xx (16-bit) created
- md5 summ checking -
MD5 summ (update.img.dump/image.md5) saved
Stored MD5 = "8eb511d82a7a8d8626a2ec1c5e5f6303"
Calculated MD5 = "8eb511d82a7a8d8626a2ec1c5e5f6303"
- image.cfg creating -
image.cfg created
==========================[ STOP ]==========================
hissorii@ubuntu:~$
update.img.dumpというフォルダにupdate.imgが展開されました。
内容はこんな感じ。
hissorii@ubuntu:~/update.img.dump$ ls -laR
.:
total 56
drwxrwxr-x 3 hissorii hissorii 4096 Dec 18 23:25 .
drwxr-xr-x 35 hissorii hissorii 4096 Dec 18 23:25 ..
-rw-rw-r-- 1 hissorii hissorii 14549 Dec 18 23:25 config_16.cfg
-rw-rw-r-- 1 hissorii hissorii 3768 Dec 18 23:25 config_8.cfg
drwxrwxr-x 2 hissorii hissorii 4096 Dec 18 23:25 Image
-rw-rw-r-- 1 hissorii hissorii 269 Dec 18 23:25 image.cfg
-rw-rw-r-- 1 hissorii hissorii 32 Dec 18 23:25 image.md5
-rw-rw-r-- 1 hissorii hissorii 337 Dec 18 23:25 package-file
-rw-rw-r-- 1 hissorii hissorii 614 Dec 18 23:25 parameter
-rw-rw-r-- 1 hissorii hissorii 626 Dec 18 23:25 parameter.parm
-rw-rw-r-- 1 hissorii hissorii 320 Dec 18 23:25 update-script
./Image:
total 148960
drwxrwxr-x 2 hissorii hissorii 4096 Dec 18 23:25 .
drwxrwxr-x 3 hissorii hissorii 4096 Dec 18 23:25 ..
-rw-rw-r-- 1 hissorii hissorii 8765440 Dec 18 23:25 boot.img
-rw-rw-r-- 1 hissorii hissorii 49152 Dec 18 23:25 misc.img
-rw-rw-r-- 1 hissorii hissorii 9060352 Dec 18 23:25 recovery.img
-rw-rw-r-- 1 hissorii hissorii 134636544 Dec 18 23:25 system.img
hissorii@ubuntu:~/update.img.dump$
update.img.dump/Imageのファイルは以下の通り。
hissorii@ubuntu:~/update.img.dump/Image$ file *
boot.img: data
misc.img: data
recovery.img: data
system.img: Linux rev 1.0 ext3 filesystem data, UUID=4d566984-920f-4d9d-bbec-082a618edc6b, volume name "system"
system.imgをmountしてみると、いろいろ興味深いファイルが出てくるが、最終目標はレトロフリークの解析なので、これらRetroN 5のデータに関してはとりあえず放置。
hissorii@ubuntu:~/update.img.dump/Image$ sudo mkdir /mnt/tmp4
hissorii@ubuntu:~/update.img.dump/Image$ sudo mount system.img /mnt/tmp4 -o loop -t ext3
hissorii@ubuntu:~/update.img.dump/Image$ ls -F /mnt/tmp4/
app/ build.prop fonts/ lib/ media/ xbin/
bin/ etc/ framework/ lost+found/ usr/
そしてboot.imgとrecovery.imgについては、Androidで使われる形式で、カーネルイメージとramdiskに展開される/パーティションがくっついたものとのこと。split_bootimg.plというperlスクリプトで展開してみます。
hissorii@ubuntu:~/update.img.dump/Image$ perl ~/split_bootimg.pl boot.img
Page size: 16384 (0x00004000)
Kernel size: 6955044 (0x006a2024)
Ramdisk size: 1780027 (0x001b293b)
Second size: 0 (0x00000000)
Board name:
Command line:
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
hissorii@ubuntu:~/update.img.dump/Image$ perl ~/split_bootimg.pl recovery.img
Page size: 16384 (0x00004000)
Kernel size: 6955044 (0x006a2024)
Ramdisk size: 2080384 (0x001fbe80)
Second size: 0 (0x00000000)
Board name:
Command line:
Writing recovery.img-kernel ... complete.
Writing recovery.img-ramdisk.gz ... complete.
次にboot.img-ramdisk.gzとrecovery.img-ramdisk.gzを展開します。
hissorii@ubuntu:~/update.img.dump/Image$ mkdir boot.img-ramdisk
hissorii@ubuntu:~/update.img.dump/Image$ cd boot.img-ramdisk/
hissorii@ubuntu:~/update.img.dump/Image/boot.img-ramdisk$ gunzip -dc ../boot.img-ramdisk.gz | cpio -i
6159 blocks
hissorii@ubuntu:~/update.img.dump/Image$ mkdir recovery.img-ramdisk
hissorii@ubuntu:~/update.img.dump/Image$ cd recovery.img-ramdisk/
hissorii@ubuntu:~/update.img.dump/Image/recovery.img-ramdisk$ gunzip -dc ../recovery.img-ramdisk.gz | cpio -i
7019 blocks
これで必要な情報のお膳立ては整ったが、俺の眠気が有頂天なので続きは後日...
Comment
[384] 承認待ちコメント
コメントの投稿
Trackback
http://hissorii.blog45.fc2.com/tb.php/257-a9504154