it-swarm.com.de

Was ist die Verwendung von -fno-Stack-Protector?

Ich habe eine Anwendung in C geschrieben und versuche zu verstehen, wozu der Befehl -fno-stack-protector beim Kompilieren dient. Für meine spezifische Anwendung macht es keinen Unterschied, ob ich diesen Befehl verwende oder nicht, um mich vor einem Pufferüberlauf zu schützen.

Ich habe online gelesen, dass die Befehle -fstack-protector und -fno-stack-protector den Stack-Smashing-Protector aktivieren bzw. deaktivieren. Wie kann der Protector jedoch vorab aktiviert werden, wenn ich die Anwendung selbst kompiliere? Hängt die Verwendung des Befehls möglicherweise davon ab, auf welchem ​​System die Anwendung ausgeführt wird?

22
touvlo2000

In der Standard-/Standard-GCC ist der Stapelschutz standardmäßig deaktiviert. Einige Linux-Distributionen haben jedoch GCC mit einem Patch versehen, um es standardmäßig zu aktivieren. Meiner Meinung nach ist dies ziemlich schädlich, da es die Möglichkeit unterbindet, alles, was nicht mit den Standard-Userpace-Bibliotheken verknüpft ist, zu kompilieren, es sei denn, das Makefile deaktiviert Stack Protector ausdrücklich. Es würde sogar den Linux-Kernel-Build brechen, außer dass die Distributionen mit diesem Hack zusätzliche Hacks zu GCC hinzugefügt haben, um zu erkennen, dass der Kernel gebaut wird, und ihn zu deaktivieren.

14
R..

Wenn Sie mit -fstack-protector kompilieren, wird etwas mehr Speicherplatz auf dem Stack und etwas mehr Overhead für die Eingabe und Rückkehr von einer Funktion zugewiesen, während der Code die Prüfungen einrichtet und tatsächlich prüft, ob Sie den Stack dabei überschrieben haben in der Funktion.

Es wird einen Unterschied für Ihre Anwendung machen. Wenn aktiviert, werden Stack-Überlaufangriffe schnell abgebrochen. Nur wenn Sie in Ihrem Code keine Funktionsaufrufe haben, bleibt Ihr Programm davon unberührt (und da Sie normalerweise main() schreiben und dies eine Funktion ist, die vom Startcode aufgerufen wird, hat dies Auswirkungen auf Ihr Programm). Stapelüberlaufangriffe sind jedoch nicht die einzigen möglichen Angriffe, die verwendet werden können. Es handelt sich also nicht um ein Allheilmittel. Es ist jedoch ein nützlicher Schutz mit begrenzten Kosten.

Der Schutz ist unabhängig vom System an sich; es hängt von der Version des verwendeten Compilers ab, aber das ist alles.

11

Zu den Zeitpunkten, zu denen eine Option, die mit einer Standard-Compilereinstellung übereinstimmt, nützlich sein kann, gehören:

  • wenn Sie ein Build-System verwenden, das möglicherweise eine komplexe Konfiguration enthält, die Sie anpassen möchten. Anstatt herauszufinden, wo in einem Labyrinth von Makefiles fstack-protector (beispielsweise) verwendet werden soll, können Sie leicht zusätzliche Optionen eingeben, die einfach am Ende der Liste der Optionen angeheftet werden. Wenn GCC sowohl fstack-protector als auch fno-stack-protector im Optionssatz sieht, ist der letzte in der Befehlszeile derjenige, der wirksam wird.

  • das andere Mal könnte diese Art von Dingen praktisch sein (was jedoch nicht für -fstack-protector gilt), wenn Sie eine Option haben, die eine Reihe von 'Unteroptionen' aktiviert. Wenn Sie beispielsweise -O2 einstellen, werden eine Reihe von -fxxx-Optimierungsoptionen aktiviert. Möglicherweise möchten Sie -O2 größtenteils verwenden, wollen aber nicht die strengen Aliasing-Optimierungen von GCC. Sie können also -fno-strict-aliasing angeben, um diese bestimmte Option auf ihre Standardeinstellung zurückzusetzen. (Hinweis: Dieser Fall entspricht dem obigen Fall.)

1
Michael Burr

Der Stack Protector ist Code, der vom Compiler generiert und in Ihrem Programm abgelegt wird. Es ist kein externes Programm oder Systemaufruf, das von Ihrem Programm aufgerufen wird.

1
Paul Richter

Es gibt drei Gründe, warum Sie vielleicht dies deaktivieren möchten,

  • Sie bauen eine gemeinsam genutzte Bibliothek, in der dies möglicherweise von Bedeutung ist, und andere Funktionen machen Annahmen über den Stapel.
  • Sie machen sich Sorgen um die Leistung.
  • Sie möchten anfällige Software erstellen. Dies ist sehr häufig bei Capture The Flag (CTFs) und ähnlichem der Fall, wenn Sie Protostar erstellen möchten, um einen Exploit zu demonstrieren, der sonst nicht anfällig wäre.
0
Evan Carroll