2014年3月21日金曜日

Optimus G Pro(L-04E) CMビルド①

root化の次は、カスタムカーネル・リカバリーを焼きます。

これには、ブートローダー(aboot)の脆弱性を利用します。
lokiと呼ばれているものです。

脆弱性の詳細は、英語ですが、ここのブログにあります。
http://blog.azimuthsecurity.com/2013/05/exploiting-samsung-galaxy-s4-secure-boot.html

要は、abootで署名チェックをしている箇所をboot/recovery.imgに仕込んだ
シェルコードで書き換えて、スルーしてしまおうというものです。

ただし、この脆弱性も修正されてきているので、この機種でも
KKへのアップデートがあれば、使えなくなると思います。

lokiを使うためには、aboot.imgを解析して必要なアドレスを調べます。

root化でバックアップを取得しているので、mmcblk0p5_abootを使用します。

まずは、abootをバイナリエディタで開きます。

一行目(アドレス:0x00〜0x0f)に、
05 00 00 00 03 00 00 00 00 00 00 00 00 00 F0 88
と表示されています。

この、0x0c〜0x0fを逆順に読んだものが、abootのメモリへの
展開先アドレスになります。
※逆順に読むのは、リトルエンディアンなので。

abootはヘッダーが40byteあるので、実際にコードが展開される0x88f00000から
40(0x28)を引いたものが、abootの先頭アドレスになります。
0x88f00000 - 0x28 = 0x88efffd8
これが、ABOOT_BASE_LGになります。

次に、バイナリエディタでテキスト検索で「ANDROID-BOOT!」を検索します。
2個見つかりますが、後に見つかった「ANDROID-BOOT!」のアドレスを控えておきます。
ANDROID-BOOT!_OFFSET:0x00047420

実際のプログラムで使用する際は、ABOOT_BASE_LGに上記のアドレスを足したものになります。
ABOOT_BASE_LG + ANDROID-BOOT!_OFFSET:0x88f473f8
リトルエンディアンなので、aboot内では、逆順の値が使用されています。
そこで、f8 73 f4 88をバイナリエディタでHEX検索します。
何箇所か見つかるので、前後の4byteと合わせてすべて洗い出してみます。

18 44 F5 88 F8 73 F4 88 9C 41 F5 88
^^ ^^ ^^ ^^
90 16 F3 88 F8 73 F4 88 4C 16 F3 88
18 44 F5 88 F8 73 F4 88 9C 41 F5 88
^^ ^^ ^^ ^^
39 BF 00 BF F8 73 F4 88 28 33 F3 88
98 41 F5 88 F8 73 F4 88 00 1F F3 88

そうすると、2箇所同じ16進数が並んでいる箇所があります。
これを逆順に読んだものがhdrのアドレスになります。

hdr:0x88f54418

次に、HEX検索で2d e9 f0 4f ad f5 c6 6dを検索します。
※loki.hのPATTERN4
0x11054のアドレスから始まっているのが見つかります。

これにABOOT_BASE_LGを足したものがcheck_sigのアドレスになります。
ABOOT_BASE_LG+PATTERN4_OFFSET=>check_sigs:0x88f1102c