Bufferoverflow erzwingen
-
Wie ueberpruefst du, dass dein Bufferoverflow erfolgreich war?
-
knivil schrieb:
Wie ueberpruefst du, dass dein Bufferoverflow erfolgreich war?
Mit gdb und dem erstellten Core.
Aber in diesem Fall wird keine Core Datei erstellt, also gehe ich davon aus das es kein Bufferoverflow gab bzw. keine überschrieben Return-Speicheradresse.
-
DKlay schrieb:
Mit gdb und dem erstellten Core.
Aber in diesem Fall wird keine Core Datei erstellt, also gehe ich davon aus das es kein Bufferoverflow gab bzw. keine überschrieben Return-Speicheradresse.Ich glaub du solltest dir nochmal ein paar Sachen durchlesen und das ganze erst mal Lokal machen ...
Versuch dich mal hierdran:
#include <stdlib.h> #include <stdio.h> #include <string.h> int bof(char *string) { char buffer[1024]; strcpy(buffer, string); return 1; } int main(int argc, char *argv[]) { bof(argv[1]); printf("Done..\n"); return 1; }
Ich habe dir auch noch ein paar PDF Dateien zu dem Thema Bufferoverflow hochgeladen: http://www.pixelbanane.de/yafu/1151877281/overflows.rar
Das Code Beispiel was ich gepostet habe ist aus dem PDF 273.pdf da wird schritt für schritt alles erklärt.
Btw. hier findest du auch noch Lesematerial:
http://www.phrack.org/issues.html
http://www.exploit-db.com/
http://back2hack.cc/
-
Ja Lokal habe ich das auf diese Art schon gemacht und Erfolgreich.
Aber mit Sockets und Remote gehts nicht, weswegen ich nicht verstehe wieso.
Aber Danke für Upload...vielleicht kommt ja doch jemand auf die Lösung dieses Problems
-
Mit gdb und dem erstellten Core.
Was ist ein Core? Oder meinst du Coredump? Whatever ... hast du dir den Asm-Code angesehen?
-
knivil schrieb:
Mit gdb und dem erstellten Core.
Was ist ein Core? Oder meinst du Coredump? Whatever ... hast du dir den Asm-Code angesehen?
Ja klar Coredump, aber mit asm und reverse engineering habe ich mich nicht beschäftigt. (Sollte Vorraussetzung sein, ich weiss).
Aber das sollte erstmal nicht das Problem sein, eigentlich müsste dieser Code zum BOF führen...aber warum auch immer überschreibt er die EIP bzw RET adresse nicht...und das liegt wahrscheinlich an einer Compiler option evtl. in Verbinung mit Sockets ich habee keine Ahnung und dachte einer von euch könnte mir weiterhelfen.
Shellcode und der Rest sollte danach kein Problem sein.
-
Schau dir mal den Puffer genau an.
- Was steht genau im Puffer?
- Wo im Puffer steht die Rücksprungadresse welche du überschreiben willstBeispiel:
( 41 Hex = A )
Stack: Daten
0x10EE00 41 41 41 41
0x10EE04 41 41 41 41
0x10EE08 41 41 41 41
0x10EE0C 41 41 41 41
0x10EE10 41 41 41 41
0x10EE14 41 41 41 41
0x10EE18 41 41 41 41 <-- ESP RETURN zum Hauptprogramm
0x10EE1CJetzt zähl einfach wie viele Bytes du brauchst um die Rücksprung Adresse zu überschreiben, oder rechne es aus geht ja auch. ^^
Ich persönlich mag den gdb nicht Reverse Engineering mit so Konsolen Debuggern is nicht so mein Fall.
Mit einer GUI ist das meist doch leichter, schau dir mal IDA Pro. Vielleicht fliegt dir das ja über google zu ganz zufällig zu.
(das Programm ist schweine teuer [aber auch gut]
)
Aber ich denke mal es gibt auch kostenlose GUI Debugger für Linux. Mit gdb geht das natürlich auch alles aber da ist es nicht so übersichtlich. (Meine Meinug)
Du musst dir auf jedenfall 100% im klaren sein wie das mit den Bufferoverflows funktioniert sonst ist das echt zum verzweifeln.
(Oh jetzt geht nice, ich experimentier noch ein bisschen mit dem Puffer rum, omg jetzt gehts wieder nicht. ) Die Erfahrung musste ich machen. -.-
Ah da fällt mir gerade wieder was ein:
http://tut0r1al.back2hack.cc/bufferoverflows/bufferoverflow-workshop/
Cheese aus dem Back2Hack Forum hat mal irgendwan einen Workshop zu dem Thema gemacht lad dir das Video einfach mal runter. (Ich hab den Workshop bisher noch
nicht angeschaut also ka wie gut oder schlecht der ist ich weiss nur das die
Leute aus dem Forum zufrieden waren von daher denke ich das es passt.
[Wobei die Leute auf Amazon auch mit den Jürgen Wolf Büchern zufrieden sind ...]Hier noch ein sehr gutes Tutorial von Vivek Ramachandran (Security Researcher).
Ich denke mal das ist schon Qualitativ sehr gut da der Typ auch Vorträge auf der DefCon gehalten hat ich denke mal der weiss wovon er redet.http://www.vivekramachandran.com/
http://www.securitytube.net/groups?operation=view&groupId=4
-
So ich glaube ich bin dem Problem jetzt etwas näher gekommen. Es liegt wohl an der while() schleife.
Das Programm erreicht nie das Ende.
Danke trotzdem für die Hilfe !!!!!!!!!1111
-
Normalerweise sollte es beim verlassen der Funktion display_msg crashen.
Irgendwie hab ich da so das Gefühl das da noch irgendein Schutz Mechanismus von Linux mitläuft. Eventuell könntest du das alles auch mal mit einer uralten Linux Version testen nur um sicher zu gehen.int display_msg( char *s ) { char msg[128]; strcpy(msg, s); //sprintf(msg, "[RECV]: Size: %d -> %s", strlen(s), s); printf("[RECV]: %s\tSize: %d\n", msg, strlen(msg)); return 0; }
-
Bassmaster schrieb:
Normalerweise sollte es beim verlassen der Funktion display_msg crashen.
Irgendwie hab ich da so das Gefühl das da noch irgendein Schutz Mechanismus von Linux mitläuft. Eventuell könntest du das alles auch mal mit einer uralten Linux Version testen nur um sicher zu gehen.int display_msg( char *s ) { char msg[128]; strcpy(msg, s); //sprintf(msg, "[RECV]: Size: %d -> %s", strlen(s), s); printf("[RECV]: %s\tSize: %d\n", msg, strlen(msg)); return 0; }
Du hast recht eigentlich müsste es beim Verlassen der Funktion crashen, so habe ich es mir aufjedenfall gedacht, aber mit dem Code nicht...Könnte es sein das Sockets in einem eigenständigen Thread laufen??