2012-05-23 15 views
14

He escrito una aplicación en C, y estoy tratando de entender cuál es el propósito del comando -fno-stack-protector al compilar. Para mi aplicación específica, no importa si utilizo este comando o no en términos de protección contra el desbordamiento del búfer.¿Cuál es el uso de -fno-stack-protector?

He leído en línea que los comandos -fstack-protector y -fno-stack-protector activan y desactivan respectivamente el protector de acumulación de pila, pero si estoy compilando la aplicación yo mismo, ¿cómo puede el protector habilitarse de antemano? ? ¿El uso del comando puede depender del sistema en el que se ejecuta la aplicación?

Gracias

Respuesta

8

En el estándar/de la CCG, protector de la pila está desactivada por defecto. Sin embargo, algunas distribuciones de Linux han parcheado a GCC para activarlo de manera predeterminada. En mi opinión, esto es bastante dañino, ya que rompe la capacidad de compilar cualquier cosa que no esté vinculada con las bibliotecas de espacio de usuario estándar a menos que Makefile deshabilite específicamente el protector de pila. Incluso rompería la construcción del kernel de Linux, excepto que las distribuciones con este truco agregaron hacks adicionales a GCC para detectar que el núcleo se está construyendo y deshabilitarlo.

+2

Por definición, ningún elemento compilado en un sistema con protección de pila activada por defecto se vinculará a las bibliotecas creadas con protección de pila, ya que a su vez se habría compilado en un sistema con protección de pila activada? – tbert

+1

Supongo que está tratando con la segunda parte de mi respuesta (los comentarios sobre por qué es problemática) y, en ese caso, la respuesta es no. Cualquier código que no esté destinado a ejecutarse como parte del ecosistema del espacio de usuario del host no va a vincularse con ninguna de las bibliotecas del host. (Por ejemplo, un kernel no está vinculado a ninguna biblioteca de espacio de usuario. Otros ejemplos serían código de bootloader, módulos destinados a ser leídos y utilizados como plantillas por un emulador dynrec/JIT, etc.) –

+0

No estaba hablando de espacio de kernel, pero espacio de usuario; La compilación de JIT no se está haciendo con el compilador de C; entonces, tengo que preguntar, ¿cuál es el problema al activar la protección de la pila en el territorio del usuario, más allá de quizás tener que establecer "-fno-stack-protector" en los argumentos de compilación para el kernel de Linux? – tbert

10

Si compila con -fstack-protector, habrá un poco más de espacio asignado en la pila y un poco más de sobrecarga al ingresar y regresar de una función mientras el código configura los controles y luego realmente verifica si usted sobrescribió la pila mientras estaba en la función.

Hará una diferencia en su aplicación. Si está habilitado, evitará los ataques de desbordamiento de pila rápidamente. Solo si no tiene llamadas de función en su código, no lo afectaría (y dado que normalmente escribe main(), y esa es una función que el código de inicio llama, tendría un efecto en su programa). Sin embargo, los ataques de desbordamiento de pila no son los únicos posibles ataques que se pueden usar, por lo que no es una panacea. Pero es una protección útil con un costo limitado.

La protección no depende del sistema per se; depende de la versión del compilador que está utilizando, pero eso es todo.

+0

'-fstack-protector' también reorganiza el diseño de la pila para que sea más fácil detectar un smash. – jww

0

El protector de la pila es un código generado por el compilador y ubicado en el programa. No es un programa externo o una llamada al sistema que su programa llama.

1

Tiempos en los que una opción que coincide con una configuración por defecto del compilador pueden ser útiles incluyen:

  • cuando se está utilizando un sistema de construcción que pueden tener una configuración compleja que desea modificar. En lugar de descubrir en qué parte de un laberinto de archivos MAKE podría elegir usar fstack-protector (por ejemplo), puede dejar pasar fácilmente opciones adicionales que simplemente se agregan al final de la lista de opciones. Si GCC ve fstack-protector y fno-stack-protector en el conjunto de opciones, el último en la línea de comando es el que tiene efecto.

  • la otra vez este tipo de cosas pueden ser útiles (lo que no parece aplicarse a -fstack-protector, sin embargo) es cuando tiene una opción que activa un montón de 'subopciones'. Por ejemplo, establecer -O2 activa una gran cantidad de opciones de optimización -fxxx, y es posible que desee utilizar -O2 en su mayor parte, pero no desea las optimizaciones de aliasing estrictas de GCC. Por lo tanto, puede especificar -fno-strict-aliasing para restablecer esa opción particular a su configuración predeterminada.(Nota: este caso es realmente equivalente al caso anterior)