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

J’ai écrit une application en C et j’essaie de comprendre 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 stack, mais si je comstack moi-même l’application, comment activer préalablement le protecteur? L’utilisation de la commande dépend-elle peut-être du système sur lequel l’application est exécutée?

Merci

Dans le GCC standard / standard, le protecteur de stack est désactivé par défaut. Cependant, certaines dissortingbutions Linux ont corrigé GCC pour l’activer par défaut. À mon avis, cela est plutôt nuisible, car cela empêche de comstackr 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 stack. Cela briserait même la construction du kernel Linux, sauf que les dissortingbutions avec ce hack ont ​​ajouté des hacks supplémentaires à GCC pour détecter que le kernel est en cours de création et le désactiver.

Si vous comstackz avec -fstack-protector , il y aura un peu plus d’espace alloué sur la stack 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 stack dans la fonction.

Cela fera une différence pour votre application. Si cette option est activée, elle éliminera rapidement les attaques par débordement de stack. Ce n’est que si vous n’avez pas d’appels de fonction dans votre code que votre programme restrait inchangé (et puisque vous écrivez normalement main() , et qu’il s’agisse 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 stack 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.

Le protecteur de stack 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.

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. Plutôt que de déterminer 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 se placent simplement à la fin de la liste d’options. Si GCC voit à la fois fstack-protector et fno-stack-protector dans l’ensemble des 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, vous -fxxx de -fxxx options d’optimisation -fxxx . Vous pouvez utiliser la plupart du temps -O2 sans vouloir utiliser les optimisations d’alias ssortingctes de GCC. Vous pouvez donc spécifier -fno-ssortingct-aliasing pour rétablir le paramètre par défaut de cette option. (Remarque: ce cas est vraiment équivalent au cas ci-dessus)