test example else c buffer stack-overflow protection callstack

c - example - jstl if null



¿Cuál es el uso de-fno-stack-protector? (5)

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

He escrito una aplicación en C, y estoy tratando de entender cuál es el propósito del -fno-stack-protector cuando compilo. Para mi aplicación específica, no hace ninguna diferencia si uso este comando o no en términos de protección contra el desbordamiento del búfer.

He leído en línea que los -fstack-protector y -fno-stack-protector habilitan y deshabilitan respectivamente el protector de aplastar la pila, pero si compilo la aplicación yo mismo, ¿cómo se puede habilitar el protector de antemano? ¿El uso del comando puede depender del sistema en el que se ejecuta la aplicación?


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


Hay tres razones por las que puede querer desactivar esto,

  • Está creando una biblioteca compartida donde esto puede importar y otras funciones hacen suposiciones sobre la pila.
  • Estás preocupado por el rendimiento.
  • Quieres construir software vulnerable. Esto ocurre con mucha frecuencia con Capture The Flag (CTF) y similares, como en el caso de que quisieras construir Protostar para demostrar un exploit que de otra forma no serías vulnerable también.

Los momentos en que una opción que coincide con una configuración predeterminada del compilador pueden ser útiles incluyen:

  • cuando utiliza un sistema de compilación que puede tener una configuración compleja que desea modificar. En lugar de averiguar en qué lugar de un laberinto de makefiles podría elegir usar fstack-protector (por ejemplo), puede permitirle pasar fácilmente opciones adicionales que simplemente se añaden al final de la lista de opciones. Si GCC ve tanto fstack-protector como fno-stack-protector en el conjunto de opciones, la última en la línea de comando es la que surte efecto.

  • la otra vez este tipo de cosas puede ser útil (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, la configuración -O2 activa un montón de opciones de optimización -fxxx , y es posible que desee utilizar -O2 en su mayor parte, pero no desea las optimizaciones de alias estrictas de GCC. Por lo tanto, puede especificar -fno-strict-aliasing para establecer esa opción en particular a su configuración predeterminada. (Nota: este caso es realmente equivalente al caso anterior)


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 las verificaciones y luego verifica si se ha sobrescrito. la pila mientras que en la función.

Hará una diferencia en su aplicación. Si está habilitado, evitará ataques de desbordamiento de pila rápidamente. Solo si no tiene llamadas de función en su código, no afectará a su programa (y dado que normalmente escribe main() , y esa es una función a la que llama el código de inicio, tendría un efecto en su programa). Sin embargo, los ataques de desbordamiento de pila no son los únicos ataques posibles que pueden utilizarse, 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.