Что такое использование-fno-stack-protector?

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

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

спасибо

4 ответов


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


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

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

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


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


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

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

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