PSVita

PS Vita 3.68で対策されてしまったKernelバグで遊んでみる。

PSP2は3.68のアップデートがありましたが、その内容の中に
Devkitに搭載されているアプリケーションの1つ?にKernel Stack Addrを取得できてしまうバグを引き起こすコードの組み合わせが見つかったそうでその修正があったとかなんとからしいです。(コードの情報元)

そのバグが修正されても私たちのハックライフにはなにも影響がないとのことです。

そしてアプリケーションは"★DUALSHOCK4(TM) Pairing"じゃないかと私は思ってます。(えっ?公式がDS4と繋げるようにしてるのかって?あくまでDevkit向けですよ(笑))

問題のコードは以下の通りです。

uint32_t get_sysmem_base() {
uint32_t info[0x12];

/*
  1) Call a function that writes sp to kernel stack
      カーネルスタックにspを書き込む関数を呼び出す
 */
sceAppMgrLoadExec(NULL, NULL, NULL);

/*
   2) Leak kernel stack
       カーネルスタックをリークする
 */
sceMotionDevGetEvaInfo(info);

/*
  3) Get sysmem base
      sysmemベースを取得する
 */
uint32_t sysmem_addr = info[0] & 0xFFFFF000;

return sysmem_addr;
}

さっそく上のコードを使い簡単なプログラムを組んで実行してみると

3.60での実行結果

3.65での実行結果

3.60 -> 0xAEA000
3.65 -> 0xAC9000

とこのようにアドレスの差があることが一目瞭然です(起動毎に若干アドレスかわるんですけどね^^;)

そしてこのアドレスこそがSceSysmemのアドレスとなります。
※sysmemってなに?という方に簡単に大雑把に説明するとこの端末はVitaか?それともPSTVか?などを定義しているkernel moduleです。

userlandでsysmemのアドレスが取得できたので今度はそのアドレスから+0x1000したアドレスまでDumpしてみたいと思います。
ただ、userlandからkernelメモリを参照することはできませんのでRinnegatamante氏のkuioを使いkernelメモリを参照できるようにします。

と、思ったのですがいざプログラムを組んで使ってみると、、なぜか指定したファイルサイズ分の0Byteで埋め尽くされたファイルが出来上がっていたのです。(もちろんそんなわけがありません^^;)
そういうわけで自分でuserとkernelの掛け橋となるプログラムをつくるしかありませんでした。
もちろん今までそんなプログラムを作ったことがなかったのでそのプログラムを作るのに2時間ほどかかりました^^;;;;;

そんなことはさておき、自作のkernel掛け橋で再度プログラムを組んだところうまくDumpできたみたいです。
結果 : よくわかりませんがSysmemの後半のSysmem Base + 0x2A000からメモリがDumpされていました。

自分でもSysmemをDumpしてみたいという方はこちちからvpkをダウンロードできます。
ux0:sysmem_dump_0x2A000.binへDumpされます。


ほかにもバグが見つかったらとことん遊びたいと思います

-PSVita
-