Rücksprungaddresse :BufferOverflow
-
N´Abend,
ich habe folgenden Versuch vor:
einen Server zu exploiten, der folgenden Fehler hat:char buf[500]=""; recv(sockWeit,buf,550,0);(Server Quellcode auf Anfrage ^^)
Mein Client ist schon fertig auch der Shellcode:
char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x37" "\x59\x88\x51\x0a\xbb\x77\x1d\x80\x7c\x51" "\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x0b" "\x51\x50\xbb\x28\xac\x80\x7c\xff\xd3\xeb" "\x39\x59\x31\xd2\x88\x51\x0e\x31\xd2\x52" "\x51\x51\x52\xff\xd0\x31\xd2\x50\xb8\xa2" "\xca\x81\x7c\xff\xd0\xe8\xc4\xff\xff\xff" "\x75\x73\x65\x72\x33\x32\x2e\x64\x6c\x6c" "\x4e\xe8\xc2\xff\xff\xff\x4d\x65\x73\x73" "\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8\xc2" "\xff\xff\xff\x59\x6f\x75\x20\x61\x72\x65" "\x20\x68\x61\x63\x6b\x65\x64\x4e";(SP2 spezifisch)
Ich habe es schon geschafft den Server zum Absturz zu bringen
mit genau 548 byte (es reichen auch 545 wegen der Rücksprungaddresse
)
jetzt weiß ich aber nicht wie ich die Addresse rausfinde auf die ich
zurück springen muss!! (ich glaube ich muss irgentwo in den Bufferchar bufspringen denn da sind NOP´s die bis zum Shellcode weiterleiten, oder ?) aber wie finde ich die Addresse von dem Buffer raus?
oder ist die Vorgehensweise überhaupt richtig ?Meine Frage:
was muss ich zu meinen 544 bytes Shellcode für eine Rücksprungaddresse hinzufügen (und wie finde ich sie bzw. wie wandel ich sie in shellcode um so wie den anderen Asm Code ?) ???Meine Tools: nasm.exe, ndisasm.exe, ld.exe, gdb.exe, objdump.exe, arwin.exe, shellcodec.exe(macht aus ausgabe von objdump.exe Shellcode, selbstgemacht)
ps : tutorial um Shellcode zu machen werde ich auf Anfrage mal erstellen und posten !
pps : ICH EXPLOITE NUR MEINEN EIGENEN SERVER !!!
Quellcode auf Anfrage
ppps: Rechtschreibfehler zu verschenken!________________
^SkilZz.Gaming! Clan
-
Hallo,
Ich denke, die Adresse der Rücksprungadresse auf dem Stack kann man nicht zur Laufzeit bestimmen, denn die ist abhängig davon, wann und mit welcher Vorgeschichte die fehlerhafte Funktion auf deinem Server aufgerufen wird.
Aber da du den gesamten Quellcode hast, könntest du den mit einem Debugger bis zur Stelle durchsteppen, wo die Funktion aufgerufen wird und sich die Register anschauen. So weißt du, wo die Rücksprungadresse liegt.
Dann kannst du dir anschauen, wenn du in die Funktion reinsteppst, wie der Stack vorbereitet wird und welche Adresse auf dem Stack für die recv-Funktion abgelegt wird und diese Adresse kannst du in deinem Shellcode fest verwenden.
Es kann sein, dass die Funktion mit dem simulierten Buffer-Overflow an mehreren Stellen im Programm aufgerufen wird, aber vermutlich wird dein Shellcode nur an der einen Stelle im Programm funktionieren, an der du die Registerinhalte mit dem Debugger untersucht hast.Gruß,
abc.c
-
Die Adressen musst du alle "raten". Am Besten zu schickst das Programm erst durch einen Debugger und versuchst ein Gefühl dafür zu bekommen wo die Funktion aufgerufen wird, so hast du auch eine ungefähre Adresse wo Buffer, lokale Variable, Stackframepointer, Rücksprungadresse und Argumente sind. Dann kannst du ungefähr den Abstand von Bufferende zu Rücksprungadresse schätzen. Dann baust du dir eine Rücksprungadresse die "hoffentlich" in den Buffer zeigt und hängst davon mehrere Exemplare mit an deinen Overflowbuffer. Und dann gehört noch eine Portion Glück dazu ;).
-
Einen kleinen Tip noch dazu: Die Adresse müsste ungefähr im Bereich zwischen 0 bis F..FFFFh liegen und vielfaches von 4 sein, also 4, 8, 12, 16, ...

-
Danke,
ich habe mal die Stelle gesucht wo recv() aufgerufen wird,
ich denke hier:004015F7 |. 8985 50FEFFFF |MOV DWORD PTR SS:[EBP-1B0],EAX ; | 004015FD |. C74424 0C 0000>|MOV DWORD PTR SS:[ESP+C],0 ; | 00401605 |. C74424 08 2602>|MOV DWORD PTR SS:[ESP+8],226 ; | 0040160D |. 8D85 48FCFFFF |LEA EAX,DWORD PTR SS:[EBP-3B8] ; | 00401613 |. 894424 04 |MOV DWORD PTR SS:[ESP+4],EAX ; | 00401617 |. 8B85 50FEFFFF |MOV EAX,DWORD PTR SS:[EBP-1B0] ; | 0040161D |. 890424 |MOV DWORD PTR SS:[ESP],EAX ; | 00401620 |. E8 DB010000 |CALL <JMP.&WSOCK32.recv> ; \recvwelche der Addressen muss ich jetzt als Rücksprungaddresse verwenden ?
vieleicht einfach mal 004015F8 ?PS:
ASM kann ich
C/C++ kann ich
-
Keine von denen, da das Adressen aus dem Textsegment sind. Du brauchst Stackadressen. D.h. du musst beim Debuggen den Stack ansehen.
tt
-
Die Selle scheint die richtige zu sein und hier wird, wenn ich mich nicht irre, die Adresse von buf auf den Stack abgelegt:
0040160D |. 8D85 48FCFFFF |LEA EAX,DWORD PTR SS:[EBP-3B8] ; | 00401613 |. 894424 04 |MOV DWORD PTR SS:[ESP+4],EAX ; |nach der Ausführung des Befehls LEA EAX,DWORD PTR SS:[EBP-3B8] steht in EAX die Adresse von buf - wenn man an dieser Stelle mit dem Debugger Registerinhalte anschaut, kannst du die dann in deinem Shellcode als Sprungziel angeben.
Aber wie man sieht, ist die Adresse von EBP abhängig, und ich weiss jetzt nicht, ob der Inhalt von EBP immer gleich ist, wenn man das Programm mehrmals hintereinander startet...
Muss wohl sehr interessant sein, Adressen von lokalen Variablen rauszufinden und so was
Aber wie dem auch sei, man sieht jetzt an dem Code, dass auch die Variable sockWeit auch nicht weit von Buffer steht. Die Variable wird hier auf dem Stack abgelegt:00401617 |. 8B85 50FEFFFF |MOV EAX,DWORD PTR SS:[EBP-1B0] ; | 0040161D |. 890424 |MOV DWORD PTR SS:[ESP],EAX ; |Man sieht auch, dass zwischen dem buf[500] und sockWeit ein Freiraum von 16 Byte besteht, aber das liegt wahrscheinlich darin, dass es da wietere lokale Variablen liegen, die du uns vorenthalten hast
du hast ja nur einen kleinen Ausschnitt aus der Funktion gezeigt... Oder auch der Compiler hat die Variable 16 Byte aligned angelegt, das kann auch sein...Gruß,
abc.c
-
...Entschuldigung, es muss ein Freiraum von 20 Byte und nicht 16 Byte sein...
-
ps : tutorial um Shellcode zu machen werde ich auf Anfrage mal erstellen und posten !
Jaa, super! Meld' dich an, und schreib los
Kein Scherz.MfG mikey.
-
Ich bin ThreadErsteller hab jetzt einen Account
Okey,
ich habe es so gemacht,
ich habe an der LEA EAX,DWORD PTR SS:[EBP-3B8] einen Breakpoint gesetzt
und danach den EAX Wert angesehen:Screenshot
(ASCII "BO" = Buffer Overflow vorher von mir gesetzt )EAX: 0022FBC0
(ich habe schon davor rausgefunden das der Wert ca. 0022FB24 sein muss)also muss ich an meinen Shellcode dieses Stück anfügen:
"\x00\x22\xfb\xc0" ?
aber was is mit dem "\x00" ?
Ich habe auch gehört das ich die Addresse andersrum eingeben soll : "\x24\xfb\x22\x00" aber beides Funktioniert nicht,kann der Server auch abstürzen wenn ich nur den saved frame pointer(sfp)
überschreibe ?[edit]
Okey mikey werd ich machen, nachdem ich weiß wie man die Rücksprungaddresse
überschreibt !
-
Ich würde sagen, den Wert 0022FBC0h muss man im buf-Array in Little-Endian angegeben:
buf[n] = COh,
buf[n+1] = FBh,
buf[n+2] = 22h,
buf[n+3] = 00h.Die Frage ist, wie groß ist bei dir n?
Ich schätze, n müsse größer als 524, ab 520 liegt ja sockWeit (wenn sockWeit ein Integer-Wert ist und ich mich nicht irre... wenn sockWeit ein struct ist, belegt er mehr Platz und das mit 524 stimmt nicht, dann kann auch sein, dass sogar 550 Byte nicht ausreichen).
Ich würde vielleicht so probieren:
Im buf-Array den Wert 0022FBC0h periodisch ab 524 speichern.
Ungefähr so:
buf[n] = COh, buf[n+1] = FBh, buf[n+2] = 22h, buf[n+3] = 00h für n aus { 524, 528, 532, 536, ..., 546 }.
Damit erwischt du hoffentlich die Rücksprungadresse...kann der Server auch abstürzen wenn ich nur den saved frame pointer(sfp)
überschreibe ?Was ist ein saved frame pointer? Meinst du EBP-Register? Wenn 550 Byte ausreichen, um die Rücksprungadresse zu überschreiben, dann ist auch der alte EBP auf dem Stack überschrieben. Weiß nicht, welche Auswirkung das dann auf das Programm hat...
Gruß,
abc.c
-
Der Shellcode kann erst in Aktion treten wenn der Server die Funktion mit der "übergelaufenen" lokalen Variable (char buf[500]) verlässt.
Setze mal einen Breakpoint im Server auf die erste Zeile nach "recv ()" (0x00401625). Gehe dann im Einzelschritt (trace-over) weiter bis zum ersten "RET".
Dort kannst Du anhand der Stackspitze sehen, um +/- wieviel Bytes der Offset der Rücksprungadresse im Shellcode ev. korrigiert werden muss.
-
Ich glaube,
ich werde mir erstmal ein paar Bücher über
ASM und Exploiting kaufen vieleicht versteh ich es dann besser
oder überhaupt diese ganzen Geschichten
Danke für eure Hilfe.
mfg KrokantKrockete

-
Als deutsches Buch für den Einstieg kannst du dir mal "Buffer Overflows und Formatstring-Schwachstellen ansehen" vom dpunkt Verlag, ist so ganz nett und bietet eine verständliche Einführung in die Thematik.
tt
-
Danke,
ich werde es mir mal ansehen!mfg KrokantKrockete

-
Hey, was ist mit dem versprochenen Tutorial???
-
@mikey:
Das Tutorial könnte ich schon machen,
allerdings ohne den Unterpunkt: Rücksprungaddresse rausfinden und überschreiben!soll ich trotzdem ein Tutorial machen nur um Shellcode zu machen ohne
den Punkt Rücksprungaddresse ?mfg KrokantKrokete.
-
Hi,
wurde mal Zeit dass du dich wieder meldest

Ja, wäre wirklich super von dir, wenn du uns ein kleines Tutorial allgemein zum Thema Exploits schreiben könntest. Natürlich kein Problem, ohne dem einen Unterpunkt. Du kannst ja einen Artikel für's Forum schreiben, weiter unten gibt's dazu ein Subforum. Viel Erfolg, und wir warten schon gespannt auf's Tutorial
-
Danke,
werde dann mal anfangen eins zu machen !
mfg...
pw. wo genau soll ich das posten ???
-
Das c++-Magazin sucht immer neue Autoren...