-> Exploiting Savegames [TEIL 3]
############################################################ ###################
Der Exploit
Hallo Leute,
I hab mich trotz der Tatsache, das Exploit´s nun höchst wahrscheinlich nicht mehr gebraucht werden, entschlossen ein Tutorial über das Exploiten von Savegame Bufferoverflow´s zu verfassen. Meine eigenen Erfahrungen sind in dem Tutorial enthalten.
Was ihr benötigt:
- ein funktionstüchtiges Gehirn
- Erfahrung mit Psplink , Savegame deemer Grundkurs in c , Hex-Editoren & Pspsdk (ihr müsst wissen wie man kompiliert)
- Zeit und Veständnis
[Wer weiss, vielleicht braucht man es ja wieder bei der NGP ]
Backgroundwissen:
Was ist ein Bufferoverflow ?
Grundlegend ist ein Bufferoverflow , wie der Name schon ausdrückt, ein Überflug an Daten im Stack.
Ok, das ist der Stack. Wie man dem Bild entnehmen kann dort ein "String" mit bis zu 12 verfügbaren Zeichen ohne Probleme gespeichert werden.
Doch was würde passieren wenn wir nun mehr Zeichen im Stack speichern, als uns die Funktion erlaubt ?
Baaam, da haben wir den Salat!
Es wurden viel mehr Zeichen gespeichert, als durch "char c [12] ; " im Speicher reserviert wurden.
Die Folge:
-> Die Return Address (Rücksprungaddresse) wurde durch die vielen "A´s" überschrieben.
Was ist die Return Address ( $ra ) ?
Das ist die Adresse an der ein Programm fortgesetzt wird nachdem ein Unterprogramm (=Funktionsaufruf) abgearbeitet wurde.
Da wir nun die Kontrolle über die RA besitzen, können wir dadurch nun entscheiden wohin wir im Userram jumpen. Bei der PSP währe das (0x08800000 - 0x09FFFFFFF)
-Genial-
Jetzt können wir zu einem beliebigen Ort jumpen wo unser eigener Code ist, sodass er ausgeführt werden kann.
************************************************************ ***************
Nun zur PSP:
Wie können wir uns das jetzt zu Nutze machen ???
Ganz simpel - Mit Savegames
Hacker sind meistens sehr faul, sie suchen immer nach der unaufwendigsten Methode.
Das einfachste währe nun einen "Player" Namen zu suchen , und das selbe wie Oben zu machen - Einen überlangen string erzeugen ...
Halt !!! Wie kann ich Savegames editieren ???
- Ich schlage for ihr sucht nach einem Tutorial für "savegame deemer"
Da die meisten Savegames keinen security checks haben, gelingt dies auch meist
Plötzlich, euer Savegame crasht die PSP. Ein kurzer Blick in PSPlink gibt uns diesen Auszug:
Rechts unten , im Bild erkennt man das register $ra
Was war $ra nochma ?
Ach ja die Rücksprungaddresse , unser Winner Register für Code Execution ^^
Ok, wir sehen uns mal das value in $ra an: 0x41414141 - Wie wir schön sehen können, wurde das register völlig mit A´s überschrieben.
Das sollte unser Code sein, den wir nun ab dieser Stelle beliebig ändern können!
************************************************************ ***************
Einen Ort zum Jumpen finden
Wir können nun zu jeder beliebigen Addresse im RAM springen.
Nun müsst ihr einen Memory Dump von eurer PSP nach dem Crash machen. Das ganze könnt ihr mit Psplink anstellen.
Der Eingabecode lautet:
savemem 0x08800000 20000000 euer_mem_dump.bin
Denn das Savegame wird ja auch in den RAM der PSP geladen.
Also , der nächste Schritt erfordert das wir unseren Memory Dump & unser unenrypted Savegame in den Hexeditor laden.
Wir müssen jetzt unser Savegame in Memory Dump suchen
Wenn wir es gefunden haben, müssen wir auf dem Savegame ( sowohl auf dem Memdump als auch bei unencryteten Savegame) einen freien Platz suchen wo wir unseren Shellcode später ausführen werden.
Moment , what the hell is a shellcode ? - Dazu kommen wir später.
links ist der Memory Dump, rechts ist unser decryptetes Savegame (sddata.bin)
Cool, hier haben wir einen netten Ort gefunden. Links ist der Platz vom Savegame im RAM , wohin wir mit unserer $ra jumpen werden und rechts muss der exakt selbe Platz im Savegame gewählt sein.
So wir merken uns vom Memdump:
Wir haben den Memdump ab 0x08800000 gedumpt. Im Memdump sind es dann nochmal 0x32C410 bytes. Also rechnen wir 0x08800000 + 0x32C410 = 0x08B2C410
Eines hätten wir schonmal , da wir $ra beliebig ändern können, werden wir das Value dort von 0x41414141 in 0x08B2C410 ersetzen
Rechts im Savegame selbst, merken wir uns 0x43F0 , ab 43F0+ werden wir später unseren Shellcode einfügen.
************************************************************ ***************
Eboot.bin
Nun brauchen wir erst einmal eine .ISO von unserem Spiel.
Wenn ihr euer Spiel in eine ISO convertiert habt, benützt ihr am besten "UMDGEN" , denn wir brauchen nun eine Datei der ISO - nämlich die EBOOT.BIN , die müsst ihr suchen und aus dem Spiel extrahieren.
Warum brauche ich die ?
- In der EBOOT.BIN finden wir die API Functions ( Stubs ) , welche das Spiel importiert und die wir für unseren Shellcode brauchen.
Nun müsst ihr die EBOOT.BIN decrypten, dafür benützt ihr das Homebrew "PRXDecrypter".
************************************************************ ***************
Arbeiten mit PRXTool
Nachdem ihr es decrypted habt , brauchen wir die .exe "PRXTool" !
Zudem benötigen wir ein xml file , das "nids" beinhaltet. Ihr könnte es hier downloaden:
http://silverspring.lan.st/ (ihr bracht das libdoc für Firmware 5.00 )
Mit folgendem Code könnt ihr nun die importierten Stubs des Spiels entnehmen:
prxtool -f -n name_of_your_libdoc.xml EBOOT.BIN
Der folgende Output ist ganz wichtig uns sollte in einer .txt Datei gespeichert werden !
Wir sollten nun sowas haben
Eine Liste mit Functionen solltet ihr nun aufgelistet haben, die sich wie folgt aufbaut:
(0x42EC03AC) = nid (0x08C88568) = stub (sceIoWrite)= Functions-Name
Was wir brauchen sind die Stubs !!!
Stubs sind pointer zu einer Funktion, im weiteren werden wir Folgen Funktionen benötigen:
sceIoOpen
sceIoRead
sceIoClose
sceKernelDcacheWritebackInvalidateAll
************************************************************ ***************
Finally - DER SHELLCODE
Nun , der Shellcode ist nichts anderes , als ein kleines Programm, dass eine Binary (h.bin) öffnet (sceIoOpen), von ihr x bytes liest (sceIoRead), und dann die Binary wieder schließt(sceIoClose).
Dieser Shellcode wird in euerem vorher ausgesuchten Platz im decrypteten Savegame eingefügt.
So kann die $ra Addresse zu unserem Shellcode pointen, welcher dann von der PSP ausgeführt wird - ob sie will oder nicht
Alles was ihr jetz noch machen müsst sind die rot eingekreisten Funktionspointer (Stubs) mit euren durch Prxtool erhaltenen Stubs zu ersetzen.
Danach speichern und nun müssen wir dass Assembler File kompilieren.
Das könnt ihr mit folgendem Code:
psp-as euer_assembler_file.asm
psp-objcopy -O binary a.out shellcode.bin
Nun nur noch an eure ausgewählte Stelle im Decrypteten Savegame einfügen, und euer Exploit is fertig
Geschafft !!!
************************************************************ ***************
Encrypten von euren decrypteten Savegames
So , ihr habt zwar jetz einen Exploit, aber ihr könnt ihn noch nicht auf einer OFW testen.
Ihr müsst erst noch mit dem Homebrew "SED" euer Savegame wieder encryten. Ich bin sicher Ihr findet auch hier ein Tutorial im Internet
Aber danach solltet ihr ein exploitetes Savegame besitzen, welches eure Binary´s auf einer OFW ausführen wird !
************************************************************ ***************
Abspann
Ok, somit währen wir am Ende des TUT´s angelangt.
So nun wisst ihr wie man einen Savegame Exploit schreibt
Zudem , falls es bei eurem Savegame einfach nicht funktionieren will, kann das mehrere Gründe haben.
Der Prozess ist sehr aufwendig , und deswegen macht man schnell Fehler ^^
In dem Fall würde ich ein Dev um Hilfe bitten.
Ich werde noch einen Anhang zum Download anbieten, wo noch einiges an Zeug drin sein wird , was ihr brachen könntet , unter anderem der Shellcode .
Download
############################################################ ##################
-> Exploiting Savegames [TEIL 2]
-> Exploiting Savegames [TEIL 3]