行き詰まりました。UNO Exploit CEF 6.60 TN-C by Frostegater





wololo.netで、Frostegater氏が『UNO』のexploitをTotal_Noob氏の開発したCEF 6.60 TN-Cへ移植しPS Vita 2.00から2.02で起動するようにしたCEF 6.60 TN-C for Vita OFW 2.02をリリースしたことを伝えていました。日本版には関係ないですが海外版では言語設定が英語になっていない場合にクラッシュするなどのトラブルがあっため、現在は起動時にクラッシュするバグを修正したアップデート版も公開されています。

新たにexplotが公開されたものの、実際にできることは今までの6.60 TNと変わりません。最新ファームウェアでも6.60 TNが利用できるようになったことが特徴だと言えます。

今回修正版公開に合わせ、わざわざ以下の内容がwololo氏により告知されています。

    Frostegater氏がUNO exploitの発見者は自分だけではないことを改めて公表しています。
    Frostegater氏は自分で発見したUNO exploitを利用してCEFを移植しただけですが、他にも多くの人がUNO exploitを発見しているため実際の”持ち主”を特定するのは非常に難しい状態だと言えます。
    このことはReadmeにも記載してあります。Frostegater氏はクレジットとしてxiaolin氏、zer01ne氏、MaxiExtreme氏の名前を挙げています。

このことはReadmeを最初に読んだ時点で気がついていました。なお、日本でUNO exploitを見つけたという報告は少なくとも私のところには届いていませんでした。

そのReadmeによると、少なくともxiaolin氏、zer01ne氏、MaxiExtreme氏の3人がUNO exploitを発見しており、最初にFrostegater氏の所に発見の一報を入れたのはxiaolin氏であることに言及しています。

特段記載がありませんが、文脈からFrostegater氏は自分が最初に発見し、次にxiaolin氏が続いたという雰囲気を匂わせています。それを書かなかったのは他の発見者に配慮したのでしょう。実際には自分が世界で初めての発見者だと主張するだけの材料がないからだと思います。

ただし、ちょっと揉めただろうと思わせるのが次の一文。

wololo氏が「Frostegater氏がUNO exploitの発見者は自分だけではないと言ってるよ」とわざわざ言っていることからも想像が付く内容です。

    所有者に黙って公開できないのは十分承知してますが、発見者全員に確認することは困難です。全員が所有者ということはあり得ないので私が全リージョンのファイルを作って公開しました。

これだと、他の発見者からすると寝耳に水で納得しない人が出そうですね。とは言ってもwololo.netに集う今のVitaシーンメンバーは最終的にはまとまるだろうと信じてます。

早々とUNO exploit対策のファームウェア(2.03?)が公開されることを回避すべくソースコード公開は次のファームウェア公開後に予定しているそうです。どんなカーネルexploitだったのかはその時までには明らかになるでしょう。

ちなみにUNO exploitをPSP-1000で起動してみたところ、フリーズしてしまいました。少なくともPS Vitaにしか存在しないカーネルexploitのようです。

さて、複数の発見者がいるexploitならば簡単に見つかる内容だったのだろうかと思い調べてみたところ、このようなデータになっていました。

NPJH00016DATA00

試しにアドレスを入れている0×238から4バイトに0×41を、0x26Cから4バイトに0×42をいれてみたところ、バッファーオーバーフローで0×41に書き換わるレジスタが$a0 /$s1 /$s5の3つ存在しただけでした。

Exception - Address load/inst fetch
Thread ID - 0x04590941
Th Name - MAIN_THREAD
Module ID - 0x045B250F
Mod Name - UNO
EPC - 0x08806740
Cause - 0x10000010
BadVAddr - 0x41414441
Status - 0x20088613
zr:0x00000000 at:0xDEADBEEF v0:0xFFFFFFFF v1:0x00000000
a0:0x41414141 a1:0x09FBF9C0 a2:0x00000058 a3:0x00000039
t0:0x00000220 t1:0xFFFFFFFF t2:0x00000000 t3:0x00000000
t4:0x4892BB70 t5:0x00FFFFFF t6:0x08AC0000 t7:0x56000000
s0:0x00000220 s1:0x41414141 s2:0x00000058 s3:0x09FBF9C0
s4:0x00000039 s5:0x41414141 s6:0x09FBF9C0 s7:0x08920000
t8:0x4892BB68 t9:0xDEADBEEF k0:0x09FBFB00 k1:0x00000000
gp:0x08920B30 sp:0x09FBF970 fp:0x00000004 ra:0x088095F0

0x08806730: 0xAFB50024 '$...' - sw $s5, 36($sp)
0x08806734: 0xAFB40020 ' ...' - sw $s4, 32($sp)
0x08806738: 0x10C200F5 '....' - beq $a2, $v0, 0x08806B10
0x0880673C: 0xAFB00010 '....' - sw $s0, 16($sp)
0x08806740: 0x8E220300 '..".' - lw $v0, 768($s1)
0x08806744: 0x2442FFA9 '..B$' - addiu $v0, $v0, -87
0x08806748: 0x2C420005 '..B,' - sltiu $v0, $v0, 5
0x0880674C: 0x10400018 '..@.' - beqz $v0, 0x088067B0
0x08806750: 0x00000000 '....' - nop
0x08806754: 0xAFA00000 '....' - sw $zr, 0($sp)
0x08806758: 0x1E4000BA '..@.' - bgtz $s2, 0x08806A44
0x0880675C: 0x44801000 '...D' - mtc1 $zr, $fcr2
0x08806760: 0xC62102F4 '..!.' - lwc1 $fpr01, 756($s1)
0x08806764: 0x3C020891 '...<' - lui $v0, 0x891 0x08806768: 0x8FBF0028 '(...' - lw $ra, 40($sp) 0x0880676C: 0x46800820 ' ..F' - cvt.s.w $fpr00, $fpr01 0x08806770: 0xC44138DC '.8A.' - lwc1 $fpr01, 14556($v0) 0x08806774: 0x3C020891 '...<' - lui $v0, 0x891 0x08806778: 0x8FB50024 '$...' - lw $s5, 36($sp) 0x0880677C: 0x46010002 '...F' - mul.s $fpr00, $fpr00, $fpr01 0x08806780: 0xC44138E0 '.8A.' - lwc1 $fpr01, 14560($v0) 0x08806784: 0x8FB40020 ' ...' - lw $s4, 32($sp) 0x08806788: 0x8FB3001C '....' - lw $s3, 28($sp) 0x0880678C: 0x46020002 '...F' - mul.s $fpr00, $fpr00, $fpr02 0x08806790: 0x8FB20018 '....' - lw $s2, 24($sp) 0x08806794: 0x8FB10014 '....' - lw $s1, 20($sp) 0x08806798: 0x8FB00010 '....' - lw $s0, 16($sp) 0x0880679C: 0x46010002 '...F' - mul.s $fpr00, $fpr00, $fpr01 0x088067A0: 0x27BD0030 '0..'' - addiu $sp, $sp, 48 0x088067A4: 0x4600000D '...F' - trunc.w.s $fpr00, $fpr00 0x088067A8: 0x03E00008 '....' - jr $ra 0x088067AC: 0x44020000 '...D' - mfc1 $v0, $fcr0 0x088067B0: 0x1A40FFEB '..@.' - blez $s2, 0x08806760 0x088067B4: 0x44801000 '...D' - mtc1 $zr, $fcr2 0x088067B8: 0x0000A021 '!...' - move $s4, $zr 0x088067BC: 0x00008021 '!...' - move $s0, $zr 0x088067C0: 0x0A201A0D '.. .' - j 0x08806834 0x088067C4: 0x3C150892 '...<' - lui $s5, 0x892 0x088067C8: 0x240200C2 '...$' - li $v0, 194 0x088067CC: 0x10A20067 'g...' - beq $a1, $v0, 0x0880696C 0x088067D0: 0x240200C3 '...$' - li $v0, 195 0x088067D4: 0x10A20070 'p...' - beq $a1, $v0, 0x08806998 0x088067D8: 0x240200E2 '...$' - li $v0, 226 0x088067DC: 0x50A20094 '...P' - beql $a1, $v0, 0x08806A30 0x088067E0: 0x26050002 '...&' - addiu $a1, $s0, 2 0x088067E4: 0x24020024 '$..$' - li $v0, 36 0x088067E8: 0x10C20025 '%...' - beq $a2, $v0, 0x08806880 0x088067EC: 0x3C020891 '...<' - lui $v0, 0x891 0x088067F0: 0x2402007E '~..$' - li $v0, 126 0x088067F4: 0x10C2006E 'n...' - beq $a2, $v0, 0x088069B0 0x088067F8: 0x2402005E '^..$' - li $v0, 94 0x088067FC: 0x10C2007C '|...' - beq $a2, $v0, 0x088069F0 0x08806800: 0x2402007B '{..$' - li $v0, 123 0x08806804: 0x10C2005F '_...' - beq $a2, $v0, 0x08806984 0x08806808: 0x3C020892 '...<' - lui $v0, 0x892 0x0880680C: 0x0E201856 'V. .' - jal 0x08806158 0x08806810: 0x02202021 '! .' - move $a0, $s1 0x08806814: 0x00402821 '!(@.' - move $a1, $v0 0x08806818: 0x0E2012B0 '.. .' - jal 0x08804AC0 0x0880681C: 0x02202021 '! .' - move $a0, $s1 0x08806820: 0x0282A021 '!...' - addu $s4, $s4, $v0 0x08806824: 0x26100001 '...&' - addiu $s0, $s0, 1 0x08806828: 0x0212102A '*...' - slt $v0, $s0, $s2

普段はこんなに長くdisasmしないのですが、なにこれ状態だったのでやってみました。
最初は何かの判定に使っているっぽい$v0をコントロールするのかとも思いましたが、判定結果で飛ばされる0x088067B0はメモリーダンプしてみましたがセーブデータとは無関係の領域だったので違いました(当然ですが...)。

$a0 /$s1 /$s5とも独立して書き換えはできませんが、この逆アセンブラの領域内でその3つのレジスタは書き変わってしまうので...何がどうなるとああなるのかちょっと分かりませんでした。

時間があったらまた調べてみますが、どうやってこれをexploitにするのか分かる方いたら教えてください。

ちなみに軽くググっただけで同じUNO exploitと思われるものを結構見つけました。日付が過去なので実は結構多くの人が調べてたみたいです。アドレスの違いは日本版と海外版かと思います。みんなexploitじゃないという結論みたいですが。
wololo.net/talk • View topic - Crash
wololo.net/talk • View topic - Interesting crash!
wololo.net/talk • View topic - is my game exploitable?
wololo.net/talk • View topic - one UserMode exploit in game,But new crash has been found

Tags: , , , ,

  1. WeeLeds’s avatar

    これはコントロール出来るレジスタに特性のアドレスか何かを書き込む事で$raに書き込めるタイプなはずです。Twitterの方でリプで詳しく書きましたのでそちらの方を見てくださいm(_ _)m

  2. mamosuke’s avatar

    ツイートの方は見ました。

    スタックポインタ改変できればリターンアドレスコントロールできるようになっているのでそのことでしょうか?

    あとは$fpr01のレジスタの使い方が分からず(戻り値入れるレジスタなのは調べて分かりました)…

    あれ?

    よく考えたらスタックポインタのアドレスで決まるはずの$s5がクラッシュ直前なのに0×61616161になってるな。これはフローしたんじゃないということか。

  3. WeeLeds’s avatar

    とりあえず画像の通りバイナリを書き込めば$raに入るはずです。私はゲームを持っていないので詳しくはわかりません。
    ちなみに結構特定の実アドレスを書き込んだりする事で結果が大幅に変わる物もありますので、他にクラッシュするゲームがあったらまた調べてみるのもアリです。

  4. 173210’s avatar

    私はThe Z氏のスクリーンショットからThe Z氏が持っているゲームを調べ、片っ端から探して見つけました。
    はじめはBadVAddrが変わっただけに見えましたが、よくわからなかったのでsceKernelExitGameにjalするコードを片っ端から入れたら見つけました。

  5. dfffffff’s avatar

    エクスプロイトにはどうやってゲームを入れるのですか?わかる方教えてください

  6. mamosuke’s avatar

    exploitにゲームは入りません。

Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">