Rücksprungaddresse :BufferOverflow
-
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...
-
Wegen dem Tutorial:
Tut mir leid ich hab mir echt solche Mühe gegeben ein gutes Tutorial zu schreiben
aber es wurde wohl gelöscht ~~> kann ich nicht nachvollziehen!!
naja mikey wenn du dir das Tutorial dennoch ansehen willst dann guck hier(mit Rücksprungadresse
):Die Datei ist ein Zip-Archiv viel Spaß...
ps: Würde gerne Wissen warum es gelöscht wurde !!!
-
Hallo,
du meldest dich ja tatsächlich nochmal. Und ein Tutorial hast du auch geschrieben. Incl. Tools, Screenshots etc... Finde ich super von dir
Werd's mir gleich mal durchlesen.Warum dein Artikel (??) gelöscht wurde, kann ich auch nicht verstehen. Erst wurde dir ein Angebot unterbreitet, und anschließend wird der Artikel gelöscht. Immerhin kann man dabei auch einiges lernen. Trotzdem Dankeschön an dich. Melde dich bei mir per E-Mail bitte.
Edit: Ah sehe gerade, dein Artikel wurde nicht gelöscht. Du findest ihn im Forum weiter unten. Allerdings musst du dich zuvor per mail melden, damit dein Artikel eingestellt wird

-
Wo steht denn das Tutorial ?
Ich würde mir das auch mal gerne durchlesen.
-
hey dein mirror mit dem tut is down

bin heute auf diesen thread gestoßen und auch sehr interessiert daran!
würdest du es nochmal uppen oder mir eine mail schreiben ?
realcpp@online.dedanke.