web-dev-qa-db-fra.com

Quelle est l'utilisation de -fno-stack-protector?

J'ai écrit une application en C et j'essaie de comprendre quel est le but de la commande -fno-stack-protector lors de la compilation. Pour mon application spécifique, que j'utilise ou non cette commande en termes de protection contre le débordement de mémoire tampon ne fait aucune différence.

J'ai lu en ligne que les commandes -fstack-protector et -fno-stack-protector activent et désactivent respectivement le protecteur de suppression de pile, mais si je compile moi-même l'application, comment le protecteur peut-il être activé au préalable? L'utilisation de la commande dépend-elle peut-être du système sur lequel l'application est exécutée?

22
touvlo2000

Dans le GCC standard/standard, le protecteur de pile est désactivé par défaut. Cependant, certaines distributions Linux ont corrigé GCC pour l'activer par défaut. À mon avis, cela est plutôt dangereux, car cela empêche de compiler tout ce qui n'est pas lié aux bibliothèques d'espace utilisateur standard, à moins que le Makefile ne désactive spécifiquement le protecteur de pile. Cela briserait même la construction du noyau Linux, sauf que les distributions avec ce hack ont ​​ajouté des hacks supplémentaires à GCC pour détecter que le noyau est en cours de création et le désactiver.

14
R..

Si vous compilez avec -fstack-protector, il y aura un peu plus d'espace alloué sur la pile et un peu plus de temps système lors de l'entrée et du retour d'une fonction pendant que le code configure les vérifications, puis vérifie si vous avez écrasé la pile pendant la sauvegarde. dans la fonction.

Cela fera une différence pour votre application. Si activé, il permettra d'éviter rapidement les attaques par débordement de pile. Ce n'est que si vous n'avez pas d'appels de fonction dans votre code que votre programme resterait inchangé (et puisque vous écrivez normalement main(), et qu'il s'agit d'une fonction appelée par le code de démarrage, cela aurait un effet sur votre programme). Cependant, les attaques par débordement de pile ne sont pas les seules attaques utilisables. Ce n'est donc pas une panacée. Mais c'est une protection utile avec un coût limité.

La protection ne dépend pas du système en soi; cela dépend de la version du compilateur que vous utilisez, mais c'est tout.

11
Jonathan Leffler

Les moments où une option correspondant à un paramètre de compilateur par défaut peuvent être utiles incluent:

  • lorsque vous utilisez un système de construction pouvant avoir une configuration complexe que vous souhaitez modifier. Au lieu de savoir où, dans un labyrinthe de fichiers Makefiles, il pourrait choisir d'utiliser fstack-protector (par exemple), il peut vous permettre de facilement passer à des options supplémentaires qui sont simplement ajoutées à la fin de la liste d'options. Si GCC voit à la fois fstack-protector et fno-stack-protector dans l'ensemble d'options, le dernier sur la ligne de commande est celui qui prend effet.

  • l'autre fois, ce genre de chose peut être pratique (ce qui ne semble pas s'appliquer à -fstack-protector, cependant), c'est quand vous avez une option qui active un tas de "sous-options". Par exemple, si vous définissez -O2, une série d'options d'optimisation -fxxx est activée et vous pouvez utiliser la plupart du temps -O2 mais ne souhaitez pas utiliser les optimisations d'alias strictes de GCC. Vous pouvez donc spécifier -fno-strict-aliasing pour rétablir le paramètre par défaut de cette option. (Remarque: ce cas est vraiment équivalent au cas ci-dessus)

1
Michael Burr

Le protecteur de pile est un code généré par le compilateur et placé dans votre programme. Ce n'est pas un programme externe ni un appel système appelé par votre programme.

1
Paul Richter

Il y a trois raisons pour lesquelles vous pouvez souhaitez désactiver cette option,

  • Vous construisez une bibliothèque partagée où cela peut avoir de l'importance et d'autres fonctions émettent des hypothèses sur la pile.
  • Vous êtes préoccupé par la performance.
  • Vous voulez construire un logiciel vulnérable. Cela se produit très souvent avec Capture The Flag (FCT) et similaires, comme dans le cas où vous vouliez construire Protostar pour démontrer un exploit que vous ne seriez autrement pas vulnérable.
0
Evan Carroll