KINGx - Das inoffizielle PlayStation Forum & News Portal
[TUT] Exploiting Savegames [TEIL 1] - Druckversion

+- KINGx - Das inoffizielle PlayStation Forum & News Portal (http://www.kingx.de/forum)
+-- Forum:    PS Vita / PSP (/forumdisplay.php?fid=1)
+--- Forum: Homebrew (/forumdisplay.php?fid=8)
+---- Forum: Development (/forumdisplay.php?fid=34)
+----- Forum: Dev-Tutorials (/forumdisplay.php?fid=59)
+----- Thema: [TUT] Exploiting Savegames [TEIL 1] (/showthread.php?tid=34054)


[TUT] Exploiting Savegames [TEIL 1] - DarXPloit_$a1 - 03.02.2011 16:00

-> Exploiting Savegames [TEIL 2]

-> 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 Wink ]




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 Wink
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:

Code:
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 Smile

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:

Code:
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 Big Grin



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 Big Grin



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:

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 Big Grin
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 Smile

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]


RE: [TUT]Exploiting Savegame Exploits - HacKmaN - 03.02.2011 16:23

Hey, super Tutorial Smile


RE: [TUT]Exploiting Savegame Exploits - greenieZ - 03.02.2011 16:24

cooles tut. wäre es mal ausprobieren.


RE: [TUT]Exploiting Savegame Exploits - Neutrosider - 03.02.2011 16:35

schönes Tutorial, da es einfach vertändlich erklärt und mit vielen bildern ist ^^


RE: [TUT]Exploiting Savegame Exploits - Cha0z - 03.02.2011 16:41

SUPER TuT!!! Mach die Bilder etwas kleiner oder setze sie in einem Spoiler Smile Der Rahmen von PSPKing is überlastet Haulol
Frage: Welches Spiel hast du benutzt? Patapong?? Big Grin


RE: [TUT]Exploiting Savegame Exploits - DarXPloit_$a1 - 03.02.2011 16:52

Dank erst einmal, schön das es euch gefällt.
Leider muss ich auch anmerken ,dass ich einiges nicht so ausführlich erklären konnte Sad

Mein Ziel ist es leicht und verständlich zu erklären.
Wir wollen ja auch schließlich Homebrew auf der NGP Wink

Ich werde auf jeden Fall meine hacking threads updaten


RE: [TUT]Exploiting Savegame Exploits - PSP_Lord - 03.02.2011 16:54

Gutes Tutorial, eine kleine Verbesserung in Sachen MIPS delay slot hätte ich aber noch Wink

Anstelle immer
li $a2, Wert
jal $sceIoFileManagerFunction()
nop

zu schreiben, empfehle ich dir:

ori $a2, $zero, Wert //li ist nur ein Pseudo Befehl, der vom Compiler als
lui $a2, Wert
addiu $a2, $a2, Wert
verstanden wird.

Außerdem kannst du deinen Befehl in den delay slot der JAL packen, das macht die nop überflüssig und spart codeWink (Erklärung: der Befehl in einem delay slot wird immer VOR der Ausführung des Jumps ausgeführt.)

Also z.B:

ori $a1, $zero, 1
JAL $sceIoOpen()
ori $a2, $zero, 31
//nächster Funktionsaufruf, ohne weitere nop

Gutes Tutorial Wink

Edit2: Sorry, habe mir nochmal den Text durchglesen und gesehen, dass da noch ein Fehler ist.
$ra = return address, nun, das ist nicht die return Addresse, sondern lediglich ein MIPS Register ($31), der die return Addresse hält.
Du sagst zwar weiteroben, dass $ra ein register ist, aber im weiteren Verlauf bezeichnet du es als "Rücksprungaddresse" was nicht richtig ist.
Außerdem ist meiner Meinung nach die Bezeichnung "Rücksprungaddresse" ziemlich "gezwungen". Bleib einfach bei "the register "$ra
speichert die return addresse, um zur Addresse von dem jeweiligen -link Befehl in MIPS (z.B JAL) + 0x8 zu springen.

Beispiel, unsere JAL ist bei 0x00001234, dann würde $ra nach dem Aufruf 0x08801238c "halten".

Edit: Könntest du mir erklären, wie man PSPLink zum Laufen bringt? Ich habe mir die Anleitungen durchgelesen,
habe es aber nie richtig hinbekommen. Danke im Vorraus.


RE: [TUT]Exploiting Savegame Exploits - DarXPloit_$a1 - 03.02.2011 17:12

Cha0z :
SUPER TuT!!! Mach die Bilder etwas kleiner oder setze sie in einem Spoiler Smile Der Rahmen von PSPKing is überlastet Haulol
Frage: Welches Spiel hast du benutzt? Patapong?? Big Grin


Eins aus dem Internet ^^

Auch wenn wir jetzt nicht mehr auf Savegame Exploits angewiesen sind,
ich werde keine screenshots von meinen eigenen Save sploits benutzen.
Tut mir leid Wink


RE: [TUT]Exploiting Savegame Exploits - DarXPloit_$a1 - 03.02.2011 17:17

PSP_Lord :
Gutes Tutorial, eine kleine Verbesserung in Sachen MIPS delay slot hätte ich aber noch Wink

Anstelle immer
li $a2, Wert
jal $sceIoFileManagerFunction()
nop

zu schreiben, empfehle ich dir:

ori $a2, $zero, Wert //li ist nur ein Pseudo Befehl, der vom Compiler als
lui $a2, Wert
addiu $a2, $a2, Wert
verstanden wird.

Außerdem kannst du deinen Befehl in den delay slot der JAL packen, das macht die nop überflüssig und spart codeWink (Erklärung: der Befehl in einem delay slot wird immer VOR der Ausführung des Jumps ausgeführt.)

Also z.B:

ori $a1, $zero, 1
JAL $sceIoOpen()
ori $a2, $zero, 31
//nächster Funktionsaufruf, ohne weitere nop

Gutes Tutorial Wink

Edit2: Sorry, habe mir nochmal den Text durchglesen und gesehen, dass da noch ein Fehler ist.
$ra = return address, nun, das ist nicht die return Addresse, sondern lediglich ein MIPS Register ($31), der die return Addresse hält.
Du sagst zwar weiteroben, dass $ra ein registe rist, aber im weiteren Verlauf bezeichnet du es als "Rücksprungaddresse" was nicht richtig ist.
Außerdem ist meiner Meinung nach die Bezeichnung "Rücksprungaddresse" ziemlich "gezwungen". Bleib einfach bei "the register "$ra
speichert die return addresse, um zur Addresse von dem jeweiligen -link Befehl in MIPS (z.B JAL) + 0x8 zu springen.

Beispiel, unsere JAL ist bei 0x00001234, dann würde $ra nach dem Aufruf 0x08801238c "halten".

Edit: Könntest du mir erklären, wie man PSPLink zum Laufen bringt? Ich habe mir die Anleitungen durchgelesen,
habe es aber nie richtig hinbekommen. Danke im Vorraus.


Welches Betriebssystem haste denn ?


RE: [TUT]Exploiting Savegame Exploits - PSP_Lord - 03.02.2011 17:18

DarXPloit_$a1 :
Welches Betriebssystem haste denn ?

Ahhh, Ich bitte um Entschuldigung, Ich habe Windows 7.


RE: [TUT]Exploiting Savegame BufferOverflows - eMKayWe - 03.02.2011 19:03

mit den stubs kann man auch cheat codes herstellen wie "exit game". man lässt einnen j/jr/jal command einfach zum sceKernelExit command springen und schon verlässt man das game.
aber das nur nebensache,

gutes tut


RE: [TUT]Exploiting Savegame BufferOverflows - fixit98 - 03.02.2011 19:46

Sehr schönes Tut Wink
Ich habe mit sowas mit dem Patapon Exploit angefangen,damit gehts echt leicht... Wink


RE: [TUT]Exploiting Savegame BufferOverflows - Mishka84 - 03.02.2011 21:15

Sehr gut beschriebenes Tutorial!! :-)

Das versteh sogar ich, obwohl ich keine Ahnung vom Programmieren habe!!

Wirklich sehr gut in allen einzelheiten beschrieben!

Frage:

Muss es eigentlich eine h.bin sein oder könnte man rein theoretisch jede andere ausführbare datei wie .bat, .exe, .elf (ist doch bin oder?) starten??

Freue mich schon wenn du dein nächstes Tutorial machst, werde dann mich mal mit beschäftigen Tongue Wenn die PSP3 draußen ist kann ich bestimmt schon ein HelloWorld Big Grin


RE: [TUT]Exploiting Savegame BufferOverflows - PSP_Lord - 03.02.2011 21:48

.bat und .exe funktionieren auf der psp nicht, sie ist kein Windows PC, .exe läuft nur auf windows.

Eine .elf ist keine .bin Datei, grob gesagt ist eine ELF vergleichbar mir einer .prx. Wenn du z.B. eine .prx Datei kompilierst, erhälst du auch immer eine .elf Dastei. Eine ELF Datei ist praktisch das Objekt file der prx, die unteranderem die RAN Struktur eines Games beinhaltet, unter anderem auch die exportierten Libraries Wink

Und nein, du kannst keine .ELFs über die PSP booten.


RE: [TUT]Exploiting Savegame BufferOverflows - HacKmaN - 03.02.2011 21:58

PSP_Lord :
.bat und .exe funktionieren auf der psp nicht, sie ist kein Windows PC, .exe läuft nur auf windows.

Eine .elf ist keine .bin Datei, grob gesagt ist eine ELF vergleichbar mir einer .prx. Wenn du z.B. eine .prx Datei kompilierst, erhälst du auch immer eine .elf Dastei. Eine ELF Datei ist praktisch das Objekt file der prx, die unteranderem die RAN Struktur eines Games beinhaltet, unter anderem auch die exportierten Libraries Wink

Und nein, du kannst keine .ELFs über die PSP booten.


Eine PRX ist eine ELF Wink
Es gibt 2 Typen von ELFs: Statische ELFs (wie die .elf Dateien, die vom Compiler ausgegeben werden) und Relocateable ELFs (PRXs).
Statische ELFs greifen auf feste Adressen zu, müssen also immer in den gleichen Speicherbereich geladen werden. PRXs dagegen sind dynamisch, diese können von jeder Adresse aus gestartet werden.


RE: [TUT]Exploiting Savegame BufferOverflows - niggi771 - 03.02.2011 21:59

Cool,
Danke für die ganzen Bilder, so versteht man es viel viel besser!


RE: [TUT]Exploiting Savegame BufferOverflows - DarXPloit_$a1 - 05.02.2011 16:02

Auf Anfrage wollte ich noch ein Tutorial schreiben, welches zeigt , wie man Binaries für einen Savegame Exploit schreibt - ursprünlich.

Dann habe ich jedoch bemerkt , dass es dann kein umfangreiches TUT werden würde.
Es fehlt nämlich noch eine Kleinigkeit zwischen dem Exploiten und dem Binary coden.

Daher werde ich mir zuerst diese Kleinigkeit vornehmen, und darüber ein TUT schreiben.
Es wird bald released

Hoffe ihr freut euch Smile

mfg , Darxploit


RE: [TUT]Exploiting Savegame BufferOverflows - 3m!n - 05.02.2011 16:13

Super TuT Wink
Gefällt mir,ich wette,sogar Noobs verstehen das TuT Smile
Ich hab ein Game gefunden xD

//Kleine Frage
Hast du das nciht von Wololo gelernt ?

mfg


RE: [TUT]Exploiting Savegame BufferOverflows - DarXPloit_$a1 - 05.02.2011 16:17

Unter anderen ,
M0skit0 ist ein guter Lehrer, Wololo hat mir einiges beigebracht, auch n0081 hilft gut ^^

Naja, wie gesagt: Menschen lernen von Menschen.

Würden Menschen anderen Menschen nichst beibringen, dann wären wir immer noch Höhlenmenschen.
In meiner Ansicht

Darum schreibe ich ja auch TUT´s Big Grin


RE: [TUT]Exploiting Savegame BufferOverflows - 3m!n - 05.02.2011 16:36

Ok,dann ist meine Frage ja geklärt,
Kannst du Grobeinschätzen,wann dein TuT fertig ist ?

mfg


RE: [TUT]Exploiting Savegame BufferOverflows - DarXPloit_$a1 - 05.02.2011 16:47

Vermutlich heute Abend, kann aber auch sein, dass ich es erst irgendwann morgen mache
PS: Wenn du einen Exploit hast, kannst du mich auch persönlich anschreiben, dann kann ich dir helfen. Du brauchst nicht auf das TUT warten.


RE: [TUT] Exploiting Savegames [TEIL 1] - DarXPloit_$a1 - 06.02.2011 08:40

Ok, hab das nächste TUT fertig Wink
Wer hier bis zum Schluss gelesen hat, kann mit Teil 2 weitermachen.

http://www.pspking.de/forum/showthread.php?tid=34298

SDK´s spielen eine sehr wichtige Rolle, ohne sie werdet ihr nicht in der Lage sein , etwas für euren Savegame exploit zu coden


RE: [TUT] Exploiting Savegames [TEIL 1] - HyBriDo - 06.02.2011 08:49

Super echt gutes TuT


RE: [TUT] Exploiting Savegames [TEIL 1] - DarXPloit_$a1 - 26.02.2011 19:23

HyBriDo :
Super echt gutes TuT


Danke für das Kompliment Wink


RE: [TUT] Exploiting Savegames [TEIL 1] - xXDak-LoXx - 01.04.2012 22:39

Wie schaffe ich das, dass die PSP von dem Savegame gecrasht wird?


RE: [TUT] Exploiting Savegames [TEIL 1] - Gaara4 - 02.04.2012 07:10

xXDak-LoXx :
Wie schaffe ich das, dass die PSP von dem Savegame gecrasht wird?


Alter du hast schon ein Thread mit deiner Antwort Wand
Wieso fragst du den die gleiche Frage nochmal nur in einen anderen Thread und dann sogar in einen der die dass Erklärt. Einfach mal lesen!
Und zum letzten mal ein Spiel zu crashen heißt nicht, dass man einen Exploit hat.
Zum Chrashen könnte man einfach ein Spiel nemmen wo man sich einen Namen geben muss und ihn mit den Savegame Demer einfach zu lang machen. Zag wenn du das dann startest, Crasht die PSP.


RE: [TUT] Exploiting Savegames [TEIL 1] - hans2116 - 21.04.2012 10:04

Kann jemand sagen wie man Homebrew SED benutzt wäre nett.