|
Verfasser |
Nachricht |
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
[TUT] Exploiting Savegames [TEIL 1]
-> 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 ]
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]
Dieser Beitrag wurde zuletzt bearbeitet: 17.02.2011 14:46 von DarXPloit_$a1.
|
|
03.02.2011 16:00 |
|
Folgende User bedanken sich: hans2116 (Apr-16-2012), Total_freak (Nov-9-2011), Suicide_Diamond (May-24-2011), momower1 (Feb-26-2011), dark-awesome (Feb-19-2011), manuel-cfw (Feb-5-2011), pennywise (Feb-5-2011), Deutschland 1 (Feb-3-2011), Camaro8000 (Feb-3-2011), Mishka84 (Feb-3-2011), Musik_Arab (Feb-3-2011), gutster (Feb-3-2011), Namenloser (Feb-3-2011), Amnezia (Feb-3-2011), WinterFrost (Feb-3-2011), fkrone (Feb-3-2011), onlinesoccer (Feb-3-2011), pspbricker (Feb-3-2011), The Z (Feb-3-2011), -blue7 (Feb-3-2011), greenieZ (Feb-3-2011), Neutrosider (Feb-3-2011), Cha0z (Feb-3-2011), _Kai_ (Feb-3-2011), dx3m (Feb-3-2011), lukico (Feb-3-2011), sankt_g. (Feb-3-2011), m33 (Feb-3-2011), HacKmaN (Feb-3-2011), TrueBent (Feb-3-2011) |
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: [TUT]Exploiting Savegame Exploits
Hey, super Tutorial
|
|
03.02.2011 16:23 |
|
Folgende User bedanken sich: |
|
greenieZ
King
Beiträge: 2.239
Gruppe: User
Registriert seit: Sep 2010
Status:
Abwesend
Danke erhalten: 715
|
RE: [TUT]Exploiting Savegame Exploits
cooles tut. wäre es mal ausprobieren.
|
|
03.02.2011 16:24 |
|
|
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: [TUT]Exploiting Savegame Exploits
schönes Tutorial, da es einfach vertändlich erklärt und mit vielen bildern ist ^^
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
|
|
03.02.2011 16:35 |
|
|
|
Cha0z
Banned
Beiträge: 1.501
Gruppe: Banned
Registriert seit: Oct 2010
Status:
Abwesend
Danke erhalten: 436
|
RE: [TUT]Exploiting Savegame Exploits
Alter Nick: Co$m0
Was für ein Lügner! Der Bearbeitet ein Bild mit schönen Paint -.-
Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2011 16:42 von Cha0z.
|
|
03.02.2011 16:41 |
|
|
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT]Exploiting Savegame Exploits
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
Mein Ziel ist es leicht und verständlich zu erklären.
Wir wollen ja auch schließlich Homebrew auf der NGP
Ich werde auf jeden Fall meine hacking threads updaten
|
|
03.02.2011 16:52 |
|
Folgende User bedanken sich: |
|
PSP_Lord
Durchstarter
Beiträge: 87
Gruppe: User
Registriert seit: Sep 2010
Status:
Abwesend
Danke erhalten: 133
|
RE: [TUT]Exploiting Savegame Exploits
Gutes Tutorial, eine kleine Verbesserung in Sachen MIPS delay slot hätte ich aber noch
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 code (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
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.
Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2011 17:16 von PSP_Lord.
|
|
03.02.2011 16:54 |
|
Folgende User bedanken sich: |
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT]Exploiting Savegame Exploits
SUPER TuT!!! Mach die Bilder etwas kleiner oder setze sie in einem Spoiler Der Rahmen von PSPKing is überlastet
Frage: Welches Spiel hast du benutzt? Patapong??
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
|
|
03.02.2011 17:12 |
|
Folgende User bedanken sich: |
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT]Exploiting Savegame Exploits
Gutes Tutorial, eine kleine Verbesserung in Sachen MIPS delay slot hätte ich aber noch
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 code (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
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 ?
|
|
03.02.2011 17:17 |
|
|
|
PSP_Lord
Durchstarter
Beiträge: 87
Gruppe: User
Registriert seit: Sep 2010
Status:
Abwesend
Danke erhalten: 133
|
RE: [TUT]Exploiting Savegame Exploits
Welches Betriebssystem haste denn ?
Ahhh, Ich bitte um Entschuldigung, Ich habe Windows 7.
Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2011 17:20 von PSP_Lord.
|
|
03.02.2011 17:18 |
|
|
|
eMKayWe
Halbprofi
Beiträge: 163
Gruppe: User
Registriert seit: Jul 2010
Status:
Offline
Danke erhalten: 78
|
RE: [TUT]Exploiting Savegame BufferOverflows
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
|
|
03.02.2011 19:03 |
|
|
|
fixit98
Experte
Beiträge: 610
Gruppe: User
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 525
|
RE: [TUT]Exploiting Savegame BufferOverflows
Sehr schönes Tut
Ich habe mit sowas mit dem Patapon Exploit angefangen,damit gehts echt leicht...
|
|
03.02.2011 19:46 |
|
|
|
Mishka84
Dauerhaft abwesend
Beiträge: 2.330
Gruppe: User
Registriert seit: Jun 2010
Status:
Offline
Danke erhalten: 1606
|
RE: [TUT]Exploiting Savegame BufferOverflows
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 Wenn die PSP3 draußen ist kann ich bestimmt schon ein HelloWorld
|
|
03.02.2011 21:15 |
|
|
|
PSP_Lord
Durchstarter
Beiträge: 87
Gruppe: User
Registriert seit: Sep 2010
Status:
Abwesend
Danke erhalten: 133
|
RE: [TUT]Exploiting Savegame BufferOverflows
.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
Und nein, du kannst keine .ELFs über die PSP booten.
|
|
03.02.2011 21:48 |
|
Folgende User bedanken sich: |
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: [TUT]Exploiting Savegame BufferOverflows
.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
Und nein, du kannst keine .ELFs über die PSP booten.
Eine PRX ist eine ELF
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.
|
|
03.02.2011 21:58 |
|
|
|
|