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?
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.
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.
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)
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.
Il y a trois raisons pour lesquelles vous pouvez souhaitez désactiver cette option,