.

 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
WebMoney ぷちカンパ

Exploit自作しよう~♪ 

~コラム~
大人のためのゲーム講座-DS PSP Wii PS3 Xbox360 まもすけBlogさんの記事に紹介されている
PSPのexploitでBinary Loaderを作ろう 第1部」「PSPのexploitでBinary Loaderを作ろう 第2部」参考にPSPのExploitコードの説明をします。
~はじめに~
Q.Exploitコードとは何ぞや?
A.
Exploitコードとは、簡単に言えば、バグをついたプログラムのことです。
ウイルスとかは大抵、バグをついたプログラムコードを利用して攻撃をしたり、個人情報を抜いたりします。
これを対処するために、ウイルス対策ソフトをインストールして、最新のパッチを当てておく必要があります。
本題に戻って、PSPのExploitコードには、2種類あります。
ひとつは、ユーザーモード上で任意のプログラムを動かせるExploitコード。
もうひとつは、カーネルモード上にユーザーモードから入って、システムを書き換えることが出来るExploitコードがあります。
ユーザーモードの場合には、ゲームを起動させたり、エミュレータを起動出来ても、CFWの導入することは出来ません。
なぜなら、PSP-1000のメインメモリの約半分(16MB)が、カーネルアクセス専用となっており、この空間に、PSPの動作に必要なモジュール、(*.prx)が読み込まれ、ユーザーモードの際には、書き換えは禁止され、アクセス出来ない仕組みになっています。ちなみに、プラグイン(*.prx)を読み込まないで、直接Flashの書き換えを行うことも出来ません。
Flashの書き換えには、カーネルモードである必要があります。


~実際のExploitコード~
当ブログでも紹介したので、参考程度に説明しておきます。
Exploitコードもいくつかパターンがあります。
画像の読み込みを使ったExploit、主に、ヒープ領域にプログラムを読み込ませる手法や、C言語特有のリターンアドレスを狙ったバッファーオーバーフローがあります。
Tiffフォーマットのバッファーオーバーフロー


~実際どうやるの?~
PSPの場合、MIPS R4000というCPUがメイン制御用とグラフィック用に2個あります。
簡単に言えば、MIPS R4000が自分で操れれば良い訳です。
でも、それにはアセンブラ言語を知っておく必要がありますが、Exploitコード内に、
アセンブル言語で自分のプログラムを外部ファイルにした後、IOで読み込んだり、Jump命令で自分のプログラムに飛ばすときだけ使えれば、あとはC言語でも大丈夫そうです。


~下準備~
・PSP-1000、PSP-2000、PSP-3000(CFW必須)
・prxdecrypter
・Windows PC(32bit推奨)
・PSPSH PSPLINK PRXTOOL
・バイナリエディタ(Stirling
・ファイル分割ソフト(ファイル破断+
・PSPをつなぐUSBケーブル(TypeA to TypeB)


自分のプログラムを動かすために・・・
1.PSPのレジストリ内の値が可変するレジスタ$raをフルコントロール出来るものを探す。
ex:ABCDEFG・・・とかセーブデータに書き込み、pspsh.exeで$raのデータが変化するか確認。
この際、ExceptionがBus error(instr)になっているといいみたい。

2.メモリをダンプしてジャンプする場所を探す。
PSPLinkで以下のコマンド打つ。(メインメモリの開始位置0x08800000から20000000Bite分、保存先は、PSPLinkが動いている場所。PSPLinkの保存先にmemdump.binが保存されるかと思う。)
savemem 0x08800000 20000000 memdump.bin

メモリに入れ込んだデータとダンプデータを比較する。(Stirlingで一致検索を使うと便利。20MB近くいくのでファイル破断+を利用してファイルを小さくすると楽。)
ex:セーブデータに書き込む場合、セーブデータとダンプデータを比較する。
同じデータの部分を見つけたら、そのアドレスを見る。
ex:(抜粋)
セーブデータが0x000043F0から開始。
ダンプデータが0x0032C3E0から開始。
メモリは・・・・・・0x08800000からなので、0x08800000+0x0032C3E0=0x08B2C3E0
PSPLinkで以下のコマンドを打って確認して、同じデータが出てきたらおk(0x08B2C3E0から20Byte分)
memdump 0x08B2C3E0 20
この地点で、メモリ上は0x08B2C3E0からコードを埋め込めることが確認。
セーブデータの場合、0x000043F0からExploitコードを記述する。

3.インポートするファンクションを探す。
①予め、セーブデータでExploitコードを実行する場合、複合化しておく。
体験版から抽出したEBOOT.binを書き変えてやる場合も同様に複合化しておく。
複合化する際は、prxdecrypterを使って複合化すると良い。

②複合化したファイルを用意できたら、任意のコードを読み込ませるためのロードするFileioなどの必要なファンクション(関数)を探す。(これはゲーム上、XMB上で関数のアドレスが変わるので、そのアドレスを探すため。)
PSPLinkで以下のコマンドを打ってください。(この際エラーが出ている場合、複合化できてない場合があります。)
prxtool -f EBOOT.BIN

次に、関数のアドレス一覧を作るため、PSPLinkで以下のコマンドを打ってください。(この際、prxtoolの動いている場所、保存先にyourfile.xmlが保存されます。)
prxtool -f -n yourfile.xml EBOOT.BIN


4.バイナリーローダーを作成し、コンパイルする。
Gripshiftのexploitを利用したsparta_sdkを参考にして、3のときに作ったyourfile.xmlに書かれているアドレスに書き換えます。
loader.S(ファイル名)

以下の赤字の部分をコメントしている/**/の中の関数のアドレスを変更します。
始めは、Exploitコードからジャンプさせた後のプログラムの位置を変更。
記述方法は、セーブデータが0x000043F0から開始。なので、次のアドレスのはじめ、44E0-43F0=C0がファイルの開始位置となります。


set .noat
set .noreorder

/* バイナリ合わせ */
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop


addiu $a0,$ra,0xC0/* ファイルの開始位置 */
nop
li $a1,1
li $a2,31

jal 0x08A6985C/* SceIoOpen */
nop

move $a1,$v0

lui $a1,0x0881
lui $a2,1
jal 0x08A697FC/* SceIoRead */
nop

jal 0x08A69854/* SceIoClose */
nop

lui $a1,0x0881
lui $a2,0x1

jal 0x08A6965C/* SceIoClose */
nop

nop
nop



編集がすんだらコンパイルをします。
コマンドは以下の通り(このコマンドを実行すると、コンパイル済みのファイルでa.binが出来ます。)
psp-as loader.S
psp-objcopy -O binary a.out a.bin


その後、出来たa.binを対象の物に埋め込みます。
このとき、例えば、セーブデータなどに埋め込む際は、サイズが変わらないようにしてください。
さらに、セーブデータの一部にチェック用のデータが埋め込まれているときがあるので、削除しないように注意してください。
埋め込む開始アドレスは、今回のセーブデータの場合だと、0x000043F0になります。

5.SDKの作成をする。
実際、ここまでくればあとは特にやることはないです。
SDKの作成は、3のときに作ったyourfile.xmlをアセンブル形式に変えればおkです。
ヘッダーにして、プログラム用に追加してもいいと思いますが、みずらい上に設定がしずらいと思うので、アセンブルでやったほうがいいと思います。
sdk.S(ファイル名)

sdk.Sには、使用する関数、ライブラリを自作のプログラムで使えるようにするために設定するファイルだと思ってください。逆に普段使う関数はアドレスが変わってしまうことがあるので、使うことが出来ません。
SDK.Sに使う関数、ライブラリを記述して、関数・ライブラリを使えるようにしましょう。(#の行はコメント)

追加方法は、#UserFunction以降の行に追加する関数、アドレスを記述すれば大丈夫です。


.macro AddNID funcname, nid
.globl \funcname
.ent \funcname
\funcname=\nid
.end \funcname
.endm

.file 1 "sdk.c"
.section .mdebug.eabi32
.section .gcc_compiled_long32
.previous
.text
.align 2

#UserFunction
AddNID sceKernelLibLoader,0x0888918A






6.動作を実証するためのバイナリーファイルを作成する(Hello Worldなど)
いままでのプログラミングとは違い、#include などは使えません。
MakeFileのオプションのLIBの欄に、sdk.Sを追加してください。
あとは普通にプログラミングすれば大丈夫です。
コンパイルした後の出力するファイルは、h.binにして、ms0:/h.binにしておいってください。唯、4の際に、ファイルの保存先をms0:/h.binにしていなければ、指定した保存先に保存してください。

7.組み込んでExploit実行する
6で作成したファイルを開始アドレス、0x000043F0にファイルの保存先を追加した次の行から埋め込んでください。わからなければ、0x000044F0まで0x00で埋めて、プログラムを埋め込むといいと思います。
埋め込めたらあとは、savedataなら、暗号化しなおした後、ゲーム上で読み込めば実行されるはずです。
WebMoney ぷちカンパ

この記事へのコメント

コメントをお寄せ下さい

 必須
 必須
 必須
       
 必須
(コメント編集・削除に必要)
(管理者にだけ表示を許可する)

トラックバック

この記事のトラックバックURL
http://psp0kaizou.blog36.fc2.com/tb.php/601-0549b5da

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。