Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
Stack Overflow - Hackit |
|
Hi,
ich veranstalte hier mal ein Hackit der etwas anderen Art.
Ich habe ein kleines Konsolenprogramm unter Windows gecodet. Dieses Programm beinhaltet einen "Programmierfehler", den man in Form eines Stack Overflows nutzen kann um eigenen Code auszuführen.
Ziel ist es das Programm gezielt zu manipulieren, so daß es eigenen Code ausführt. Das kann das Ausgeben einer eigenen Meldung sein oder auch was völlig anderes. Laßt eurer Kreativität freien Lauf. Wenn das Programm dabei abstürzt ist das egal. Hauptsache ist, daß es vor seinem Ableben noch den injizierten Code ausführt.
Noch einmal im Klartext: Es geht nicht darum das Programm zu patchen, sondern darum, das Programm mittels gezielter Parameterübergabe zum Ausführen von eigenem Code zu bringen. Mit anderen Worten: Entwickelt einen Exploit.
Ich weiß, keine leichte Aufgabe. Bei Bedarf kann ich ja weitere Hilfestellungen geben. Einfach die angehängte Datei runterladen und in "hackme.exe" umbenennen. Bei Bedarf kann ich auch den Quellcode posten. Die Sache wird dadurch aber nicht wesentlich leichter werden, da ich in ASM code
Viel Spaß
--------------------------
Hall of Fame:
1. CDW
2.
3.
Dateianhang: |
hackme.txt (3 KB, 59 mal heruntergeladen)
|
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Compuholic: 01.12.2002 10:27.
|
|
23.11.2002 21:47 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
Ui. Verdammt. Jetzt erfährt die Welt doch noch, dass ich kein IA32-Assembler kann *g* Oder darf man auch irgendn fertigen Shellcode oder was auch immer nehmen? *g*
Greets, Ziri
__________________ palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+
|
|
23.11.2002 22:01 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
ich bin gerade am überlegen,wie man hexcode 00 als argument übergibt...., ansonsten schon was geschrieben (mit delta offset usw, wenn es klappt, müsste eine Datei im selben verzeichniss erstellt werden...)
|
|
24.11.2002 14:52 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
Themenstarter
|
|
Du brauchst doch gar nicht 00 als Rücksprungadresse zu übergeben. 00 ist das "most significant byte" befindet sich also auf der niedrigsten Speicherzelle. Der Stack wächst von den hohen Speicherstellen zu den niedrigen.
Es steht aber schon 00 auf dem "most signifikant byte". Das brauchst Du gar nicht zu überschreiben. Häng einfach als letztes Zeichen 00 an. Das Byte wird zwar dann nicht mitkopiert, das macht aber auch nichts, weil der richtige Wert sowiso schon drinsteht.
Bei meinem Problem hilft mir die Parameterübergabe über ein Programm leider nicht, weil ich das hackme ja mit den übergebenen Werten debuggen will.
|
|
24.11.2002 20:25 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
nein,ich wollte ja den ganzen code als parameter übergeben...die rücksprungadresse wird ja "rückwärts" eingelesen, muss also andersum auf dem Stack abgelegt sein und wenn man mehr Code reinschreiben will als nur die adresse (da DWORD) musste man irgendwas machen, damit es als ASCII übergen kann... ansonsten, wenn man das ganze local machen würde, würde ich einfach einen jmp auf meinen speicherbereich machen, wo mein Code steht..
das hatte ich schon früh raus: einfach mal
mit hackme.exe fuellzeichenfuellzeichenW@
starten... dann beendet man das programm vorzeitig...
|
|
24.11.2002 20:37 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
das hab ich mir ungefähr auch gedacht, theoretisch müsste es ja auch klappen, nur in der praxis happert es... ich habe in Olly geschafft, in den Speicher meinen code reinzuschreiben und auszuführen... nur kann ich den nicht als parameter übergeben (bzw. ich weiß nicht, wie das geht...) ansonsten hab ich schon ein proggie gecodet, das einen beliebigen Code als Binärdatei abspeichert, die dann einfach herauskopiert weren kann... die Adresse, die hab ich ja auch schon... wie gesagt, das ganze ist ein Übergabeproblem
|
|
24.11.2002 21:52 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
ich kann die Datei nicht öffnen.
Devil
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
24.11.2002 22:08 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
Themenstarter
|
|
@CDW: Mit WinExec funktioniert es. Du übergibst einfach den präparierten String. Momentan hab ich noch Probleme mit dem Shellcode. Die Adressierung der Variablen und der API-Calls ist knifflig.
@Devil: Hast Du die Dateiendung in .exe geändert? Ich habe die Datei, damit ich sie anhängen kann als .txt gespeichert.
|
|
24.11.2002 22:48 |
|
|
[TH]
»®€ªN¡M¡€RT«
Dabei seit: 24.11.2001
Beiträge: 424
|
|
@Devil <Rechtsklick>-<Ziel Speichern unter...> und dann hängst du an den Dateinamen (Hackme) '.exe' also Hackme.exe!
__________________ ___________________________
:::::::::::::::::::::::::::::::::::::
.....we gonna get out of this sick society! no one who leads and no one who follows......
:::::::::::::::::::::::::::::::::::::
|
|
25.11.2002 19:13 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
Themenstarter
|
|
So ich hätte es dann soweit. Das einzige Problem an meinem Exploit ist, daß der letzte API-Call der die Meldung ausgeben soll (noch) nicht funkioniert. Aber das kriege ich schon noch hin.
Ich weiß ja nicht, woran es bei euch liegt, daß sowenig mitmachen. Wo liegen die Probleme?
Ich gebe zu, daß ich das ich den Puffer für den Shellcode etwas klein bemessen habe. Ich habe beim Programmieren von meinem Exploit gemerkt, daß ich immer wieder Platzprobleme bekommen habe. Daher hat er einiges am Flexibilität eingebüßt, und trotzdem belegt er jetzt die volle Puffergröße. (So ist beispielsweise das StdOut-Handle hardcoded. Das hätte nicht sein müssen, wenn ich nur ein paar Bytes mehr Platz gehabt hätte).
Wo liegen eure Probleme? Braucht Ihr mehr Hinweise? Braucht Ihr den Shellcode, weil ihr kein ASM könnt?
Soll ich ein Programm mit größerem Puffer online stellen?
@CDW: Schau Dir mal z.B. Folgendes im Debugger an: overflow <Fuellzeichen>hhhf wobei "hhhf" die Bytes darstellen sollen, die die Rückprungadresse überschreiben. Du wirst feststellen, daß das "f" an die Stelle der "00" geschrieben wird. Das heißt doch, daß Du Dich um dieses Byte gar nicht kümmern brauchst, weil es sowiso schon dasteht. Der Puffer wird von den niedrigen zu den hohen Adressen gefüllt. Also setzt Du die Rücksprungadresse auf den Anfang des Puffers.
Dann darfst Du natürlich keine Füllzeichen in den Buffer reinschreiben sondern den Shellcode.
Das letzte Byte was kopiert wird ist also das Byte vor dem NULL-Byte der Rückprungadresse. Mehr braucht es auch gar nicht
|
|
26.11.2002 22:57 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
Also was mich angeht: Ich kann kein IA32-Assembler. Ich kann schon abschätzen, dass das ne größere Sache wäre, deshalb hab ichs noch garnicht angepackt, ich brauche erstmal mehr Zeit dazu
Und als letztes kommt dazu, dass ein Windows-Binary bei mir keine hohe Motivation bringt, weil ich noch nichtmal wirklich WIndows installiert habe, nur in vmware
Aber das wird wohl bei den wenigsten der Fall sein
Habe jedenfalls vor, es mir anzuschauen, aber dann muss ich mich mit genug Zeit dransetzen *g*
Greets, Ziri
__________________ palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+
|
|
26.11.2002 23:58 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
Themenstarter
|
|
Das ist richtig:
Fast die Hälfte des Buffers geht dafür drauf das Stackframe, das durch "leave" zerstört wurde wiederherzustellen und die XOR-Codierung wieder aufzuheben.
Dann kommen noch die notwendigen Strings und Variablen dazu.
Effektiv bleiben mir nur noch 26 Bytes für Programmcode übrig (gut geschätzt). Das ist grad mal 1 API-Call mit Parametern.
|
|
27.11.2002 19:04 |
|
|
|
|
|