2010-12-01 7 views
0

Ich versuche, einen Pufferüberlauf auszuführen, um Code auszuführen, aber das Problem ist, dass wenn ich versuche, den Code nur auszuführen, um einen Pufferüberlauf zu erhalten, Windows eine Meldung mit der Meldung "Programm funktioniert nicht mehr Windows sucht nach einer Lösung für das Programm, also wenn ich versuche, sicherzustellen, dass es nur einen Überlauf um ein Byte hat, läuft das Programm nur, aber das Befehlsfenster wird nicht angehalten, damit ich den Segmentierungsfehler sehe Adresse. Welche mein Verständnis ich brauche, um es wäre zu ändern, und es ist meine gewünschten Fenster laufen zu lassen als der übergebene parameter.Here das einfache Programm.Pufferüberlauf Problem

#define BUF_LEN 5 

int main(int argc, char **argv) 
{ 

char buf[BUF_LEN]; 

if (argc > 1) 
{ 
strcpy(buf, argv[1]); 
} 
return 0; 
printf(buf); 
system("pause"); 
} 
+0

Wie lang ist argv [1]? – zebrabox

+0

Ich mache es mindestens mehr als Buff, zum Beispiel Buff ist jetzt 5 in diesem Programm, also mache ich es "AAAAAAAA" – Eric

Antwort

1

Das Problem liegt darin, dass das Pufferüberlaufverhalten nicht standardisiert ist - Ihr Beispiel könnte sich auf eine ältere Version von Windows beziehen, die noch eine Fehleradresse ausdruckt, oder auf ein komplett anderes Betriebssystem.

Außerdem führen nicht alle Pufferüberläufe zum Absturz des Programms - es hängt davon ab, welche Daten wo geschrieben werden. Bei kleinen Pufferüberläufen überschreiben Sie möglicherweise nur einige andere lokale Variablen oder den Füllbereich, anstatt alles Notwendige für die Programmausführung (wie die Funktion return address).

+0

das beantwortet tatsächlich die Frage – Eric

0
#define BUF_LEN 5 

int main(int argc, char **argv) 
{ 

char buf[BUF_LEN]; 

if (argc > 1) 
{ 
strcpy(buf, argv[1]); 
} 

printf(buf); 
system("pause"); 
return 0; 
} 

return 0; geht am Ende. Ansonsten stoppt die Programmausführung dort.

+0

danke, jetzt druckt es den buf, aber es läuft immer noch in das gleiche Problem durch die Ausgabe keine Fehleradresse. Ist das nicht, was ich bekommen sollte – Eric

+0

Ich denke nicht, dass es eine Fehleradresse drucken soll. mehr wie ein "SegFault" Thingy. – Muggen

+0

es tut nichts zu drucken .. es die buf druckt, wie es kein Fehler war, aber wenn ich die eine beliebige Taste drücken, um fortzufahren, es läuft eine Windows-Eingabeaufforderung Last Problem Fehler ich oben erwähnt und schließt dann – Eric

2

Segmentation Fehler sind nur eine Manifestation nicht definiertes Verhalten. Es gibt wirklich nichts, das Ihnen garantiert, dass das Betriebssystem Ihnen Informationen darüber geben wird, was hier schief gelaufen ist.

Sie brauchen nicht die Adresse, um auf jeden Fall die segfault zu diagnostizieren. Es gibt genau eine Sache, die hier einen Pufferüberlauf verursachen kann und Sie wissen genau, was es ist: der Aufruf strcpy().

Angenommen, Sie müssen C verwenden, besteht die Lösung darin, stattdessen strncpy() zu verwenden.

+0

ich verwechselt werden kann, aber wenn ich die OP richtig gelesen, will er absichtlich einen Pufferüberlauf für Übungszwecke verursachen. – Lars

+0

Ich weiß, dass strncpy() den Pufferüberlauf verhindern wird. aber ich versuche, eine exmaple zu schaffen zu zeigen, was ich kann, indem man mit einigem Shellcode passieren, aber ich assummed ich die seg Fehleradresse tun muß, dass – Eric

+0

@ Lars- Sie richtig sind – Eric

0

Beim Kompilieren verwenden Sie "gcc -fno-stack-protector -o out filename.c", , weil gcc eingebauten Stack Protector enthält und Sie es entfernen müssen. -fno-stack-protector wird die schutzfunktion von gcc entfernen

Verwandte Themen