2010-03-03 5 views
6

Mein Programm stürzte ab, als ich die Option -fstack-check und -fstack-protector hinzufügte. __stack_chk_fail wird in der Rückverfolgung aufgerufen.Wie funktioniert die gcc-Option -stack-check genau?

Also wie könnte ich wissen, wo das Problem liegt? Was prüft -fstack-check wirklich? Die Informationen über gcc scheint zu groß, um die Antwort zu finden.

Antwort

5

nach der Montage Programm geprüft geben wird. Ich denke -fstack-check, fügt Code write 0 zu einem Offset des Stackpointers hinzu, um zu testen, ob das Programm eine Übertretungsadresse besucht, ist das Programm zum Absturz gekommen, wenn es das tut. z.B. mov $ 0x0, -0x928 (% esp)

+0

können Sie mit einigen Codebeispielen und Ausgabe erarbeiten? –

+0

Das hat nichts mit Ihrem Fehler zu tun. Siehe meine Antwort unten – rurban

2

„` -fstack-Protektor‘extra Code aussendet für Pufferüberlauf, wie Stack Zerschlagung Angriffe zu überprüfen. Dies wird durch das Hinzufügen einer Wache Variable Funktionen mit empfindlichen Objekten durchgeführt wird. Dazu gehören Funktionen, die Anruf alloca, und Funktionen mit Puffern größer als 8 Byte. die Wachen initialisiert werden, wenn eine Funktion eingegeben und dann überprüft , wenn die Funktion beendet. Wenn eine Schutzprüfung fehlschlägt, wird eine Fehlermeldung gedruckt wird und das Programm beendet“

GCC Options That Control Optimization

GCC extension for protecting applications from stack-smashing attacks

Smashing The Stack For Fun And Profit

Ich hoffe, das einen Hinweis ..

+0

Das ist eine große Hilfe, danke. – stcatz

+4

Bitte beachten Sie, dass "-Stack-Protector" und "-Stack-Check" verschiedene Optionen sind. (für Kollegen Googler) – Offirmo

1

-fstack-check: Wenn zwei Feature-Makros STACK_CHECK_BUILTIN und STACK_CHECK_STATIC_BUILTIN im default 0 gelassen werden, es fügt nur eine Null-Byte all 4kb (Seite), wenn der Stapel wächst. Standardmäßig nur eine, aber wenn der Stapel mehr als eine Seite wachsen kann, was der gefährlichste Fall ist, alle 4 KB. linux> 2.6 hat nur eine kleine Seitenlücke zwischen dem Stack und dem Heap, was zu Stack-Gap-Attacken führen kann, die seit 2005 bekannt sind. Siehe What exception is raised in C by GCC -fstack-check option für den Zusammenbau. Es ist in gcc mindestens seit 2.95.3, in clang seit 3.6 aktiviert.

__stack_chk_fail ist der eingefügte Code -fstack-protector, der einen eingefügten Stapelkanarienwert verifiziert, der durch einen einfachen Stapelüberlauf, z. durch Rekursion.