2010-03-03 23 views
6

Mi programa se bloqueó cuando agregué la opción -fstack-check y -fstack-protector. __stack_chk_fail se llama en el rastreo posterior.¿Cómo funciona exactamente la opción gcc -fstack-check?

Entonces, ¿cómo podría saber dónde está el problema? ¿Qué comprueba -fstack-check realmente? La información sobre gcc parece demasiado grande para encontrar la respuesta.

Respuesta

5

Después comprobó el programa de montaje. Creo que -fstack-check, agregará código de escritura 0 a un desplazamiento del puntero de pila, por lo que para probar si el programa visita una dirección de violación, el programa se bloqueó si lo hace. p. mov $ 0x0, -0x928 (% esp)

+0

¿Puedes elaborar con algunos ejemplos de código y salida? –

+0

Esto no tiene nada que ver con su error. Ver mi respuesta a continuación – rurban

2

"` -fstack protector' emite código adicional para comprobar si hay desbordamientos de memoria, tales como ataques de pila rompiendo. Esto se hace mediante la adición de una variable de guardia para funciones con objetos vulnerables. Esto incluye funciones que llamada alloca, y funciona con memorias intermedias de más de 8 bytes. los guardias se inicializan cuando se introduce una función y después se comprueba cuando se cierra la función. Si un cheque guardia falla, un mensaje de error se imprime y se sale del programa"

GCC Options That Control Optimization

GCC extension for protecting applications from stack-smashing attacks

Smashing The Stack For Fun And Profit

Espero que esto le dará alguna pista ..

+0

Eso es de gran ayuda, gracias. – stcatz

+4

Tenga en cuenta que '-fstack-protector' y' -fstack-check' son opciones diferentes. (para compañeros googlers) – Offirmo

1

-fstack-check: Si dos macros de características STACK_CHECK_BUILTIN y STACK_CHECK_STATIC_BUILTIN se dejan en el valor por defecto 0, sólo se inserta un byte nulo cada 4 kb (página) cuando la pila crece. Por defecto, solo uno, pero cuando la pila puede crecer más de una página, que es el caso más peligroso, cada 4 KB. Linux> 2.6 solo tiene una pequeña brecha de página entre la pila y el montón, lo que puede provocar ataques de acumulación de pila, conocidos desde 2005. Consulte What exception is raised in C by GCC -fstack-check option para el ensamblaje. Está habilitado en gcc al menos desde 2.95.3, en clang desde 3.6.

__stack_chk_fail es el código insertado -fstack-protector que verifica un valor canary pila insertado que podría sobrescribirse por un simple desbordamiento de pila, p. por recursión.

Cuestiones relacionadas