Lan.stフォーラムでpspjoke氏がPSPのセーブデータを使ったexploitを発見したと報告していました。【記事】
ゲーム自体は現在でもプレイステーションストアにあるらしいですが、現時点では何のゲームを利用しているかについては未公開です。どうやら何も進展しないままソニーに対策されてしまったFreePlay氏のexploit(Hello World)の失敗を糧に慎重に扱っている様子がフォーラムから見て取れます。
今回のexploitが動作するのはファームウェア6.20までの全PSP(PSP go含む)対応でユーザーモードexploitだそうです。今後eLoaderは予定されていくようですが、カーネルモードへアクセスが可能になるかもしれないHEN(Homebrew ENabler)まで進展するかどうかは全く未知数です。
ここ最近PSPをハックしたと主張するのは実際動画だけのFAKEがほとんどでしたが、今回は少し趣が異なります。動画が全くなく、実際PSPをクラッシュさせたときのPSPLinkを使ったレジスタ値でのexploit証明です。
ゲーム名は分かりませんが、Gripshiftの時と同様にセーブデータに「A」の文字(0x41)を大量に入れてバッファーオーバーフローを導きだしているようです。Gripshiftの時の文字コードは「a」の文字(0x61)で名前に”This is spartaaaaa….”を入力していましたが、このPSPLinkの結果は例えば「This is SARTAAAAA….”」を入れたような状態です。あちこちのレジスタに41(ASCIIコードでいうと「A」)が頻出しています。
この場合は先ほどの名前部分の「41」を「EE」に置き換えています。ここがexploitであると一目で分かるポイントで、「41」の代わりに「EE」へ置き換えたところ各レジスタの値もそれに合わせて「0xEEEEEEEEE」となったことが一目で分かります。つまりは各レジスタに任意の値を入れておくことが可能ということです。
どちらの結果を見ても分かる通り、今回のexploitは下記のレジスタの値を任意に操れることになります。
$S0〜$S7 callee-saved register
$fp frame pointer
$ra return address
PSPはこのexploitでクラッシュしていると思いますが、disasmを使ったその時のアセンブル表示がないのでこのレジスタを簡単に使えそうなのかが分かりません。仮に$raへのジャンプコールが存在していれば任意のアドレスへ飛ばすことが可能になります。そこになんらかのコードを書いてしまえば自作コードを走らせることが出来るようになります。
PSPLinkの結果はそれなりに信頼性が高いような気がしてしまいますが、当然それ自体FAKEの可能性もあります。
ただし、今回はn00b81氏という、PSP界では知名度があるフォーラムユーザーにヘルプを求めています。ある意味それが本物であるという証拠とも言えるでしょう。
Lan.stフォーラムはPSP界では知名度がのレベルが高いことで有名ですが、今回は逆にそれを上手く利用し、名前が通っているn00b81氏に検証を含めたお手伝いをしてもらっている形です。
かねてよりwololo氏が
「exploitの証拠として有名どころのユーザーに送って確認してもらえばいい」
と言っていましたが、まさにそんな展開になっています。
それにしてもPSPLinkでこんなに美しい結果が出るなんて、それを見ることが出来ただけでも幸せです。
今回のexploitはユーザーモードでしか動作しませんが、PSP goで初めてHomebrewが起動するかもしれない大きな分岐点になるかもしれません。