Что такое -fno-stack-protector?

Я написал приложение в C, и я пытаюсь понять, что является целью команды -fno-stack-protector при компиляции. Для моего конкретного приложения не имеет значения, использую ли я эту команду или нет в плане защиты от переполнения буфера.

Я читал в Интернете, что команды -fstack-protector и -fno-stack-protector позволяют включать и отключать, соответственно, защитник стека, но если я сам компилирую приложение, как можно защитить защитника заранее? Может ли быть связано с использованием команды, в зависимости от того, в какой системе работает приложение?

Спасибо

Ответы

Ответ 1

В стандартном/общем GCC стековый защитник отключен по умолчанию. Тем не менее, некоторые дистрибутивы Linux по умолчанию закрыли GCC, чтобы включить его. На мой взгляд, это довольно вредно, так как это нарушает способность компилировать все, что не связано с стандартными библиотеками пользовательского пространства, если только Makefile не отключает стековый защитник. Это даже сломало бы сборку ядра Linux, за исключением того, что дистрибутивы с этим взломом добавили дополнительные хаки в GCC, чтобы обнаружить, что ядро ​​создается и отключает его.

Ответ 2

Если вы скомпилируете с помощью -fstack-protector, тогда в стеке будет больше места, а на входе и возврате от функции будет немного больше накладных расходов, а код устанавливает проверки, а затем проверяет, перезаписал стек в функции.

Это будет иметь значение для вашего приложения. Если включено, он быстро начнет атаковать переполнение стека. Только если у вас нет функциональных вызовов в вашем коде, это оставит вашу программу незатронутой (и поскольку вы обычно пишете main(), и это функция, вызываемая кодом запуска, это повлияет на вашу программу). Тем не менее, атаки - это не единственные возможные атаки, которые могут быть использованы, поэтому это не панацея. Но это полезная защита с ограниченными затратами.

Защита не зависит от самой системы; это зависит от версии используемого вами компилятора, но все.

Ответ 3

Времена, когда может быть полезна опция, соответствующая настройке компилятора по умолчанию, включает в себя:

  • когда вы используете систему сборки, которая может иметь сложную конфигурацию, которую вы хотите настроить. Вместо того, чтобы понять, где в лабиринте make файлов он может выбрать fstack-protector (например), он может позволить вам легко передать дополнительные параметры, которые просто привязаны к концу списка параметров. Если GCC видит как fstack-protector, так и fno-stack-protector в наборе параметров, последним в командной строке является тот, который вступает в силу.

  • в то время, когда это может быть удобно (что, похоже, не относится к -fstack-protector), это когда у вас есть опция, которая включает кучу "подпараметров". Например, установка -O2 включает множество опций оптимизации -fxxx, и вы можете использовать -O2 по большей части, но не хотите оптимизировать строгий псевдоним GCC. Таким образом, вы можете указать -fno-strict-aliasing, чтобы установить эту опцию обратно по умолчанию. (Примечание: этот случай действительно эквивалентен приведенному выше случаю)

Ответ 4

Защитник стека - это код, который генерируется компилятором и помещается в вашу программу. Это не внешняя программа или системный вызов, вызываемый вашей программой.