fc2ブログ

レトロフリークで任意のコマンドをroot権限で実行する その1

タイトルどおり、レトロフリークが今回のネタなのですが、発売前のspec表にはhomebrew対応と記載され、てっきりレトロフリーク上でAndroid向けアプリが動かせたりするのかと勘違いしてしまった訳ですが、発売されてみるとそんな訳もなく、ファミコン向けhomebrewソフトやらメガドライブ向けのhomebrewソフトやらが動くという話だったりしたわけで、まぁそれはそれでうれしくない訳でもないのではありますが、せっかくだからレトロフリークを解析してもっといろいろ遊んでみたいと、Twitterの様に文字数制限を気にしなくてよいと思うと無駄に文章が長くなってしまいますが、思った次第でございます。

そこで、まずはとレトロフリークのお兄さん的なRetroN 5のhack状況を調べてみたところ、既にいろいろと進んでおり、標準では対応していないエミュレータ等も動いているようです。おぉすごい。
ただ残念ながらclosedな環境で配布等されているようで、あまり情報が表に出てきていないようです。
しかし全然全く情報がない訳でもなく、RetroN 5 Factory Reset Instructions を解析してroot化がなされ、さらにそこから解析されていった模様で、レトロフリーク用のfactory imageが公開されれば、同じようにroot化できるなーと思いつつ、予習としてRetroN 5のfactory imageの解析を細々と進めていました。

その過程で、レトロフリークにてroot権限で任意のコマンドを実行できることを発見しましたので、解析した足跡を振り返りつつまとめてみたいと思います。

まずはRetroN 5のfactory image(容量注意 80MB位あります)をダウンロードします。
普段は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

«  | HOME |  »

プロフィール

ひっそりぃ

Author:ひっそりぃ
Twitter:@hissorii_com
GitHub:hissorii


月別アーカイブ


最新記事


カテゴリ



最新コメント


最新トラックバック




RSSリンクの表示


Amazon


QRコード

QRコード

Amazon


ブログランキング

ブログランキング【くつろぐ】
にほんブログ村 ゲームブログ×PlayNCBlogへ

メールフォーム

名前:
メール:
件名:
本文:


カウンタ