es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo desactivar CET y la pila de sombra en gcc

Soy profesor de Sistemas Operativos y necesito explicar el funcionamiento de la pila y la convención de llamada de funciones en C utilizando código desensamblado real de una función simple en C.

Con fines didácticos, en una primera fase prefiero evitar explicar todas las características de seguridad de las arquitecturas de los procesadores modernos. Por lo tanto, me gustaría compilar mi ejemplo simple sin la función de sombreado de la pila (ya es bastante difícil explicar cómo funciona la pila, ¡imagínense hacerlo con 2 pilas!). Sin embargo, no tengo idea de cómo desactivarlo en gcc. Estoy utilizando gcc 9.3.0 en Ubuntu y habilito las siguientes opciones:

CFLAGS32 = -g -c -m32 -z execstack

¿Alguna pista?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, para deshabilitar el sombreado de pila en gcc 9.3.0, puedes agregar la bandera “-fno-stack-protector” a tu variable CFLAGS32. Esta bandera deshabilita la función de protección de pila que agrega un valor canario a la pila para detectar ataques de desbordamiento de búfer. Al deshabilitar esta función, puedes simplificar la explicación de la pila y la convención de llamada de funciones en C.

    En cuanto a proporcionar un ejemplo de código desmontado para una función C simple, puedes utilizar el siguiente código:

    int add(int x, int y) {
        int result = x + y;
        return result;
    }
    

    Una vez compilado con tu variable CFLAGS32, puedes desmontar el archivo objeto utilizando el comando “objdump -d”. Aquí tienes un ejemplo de cómo podría lucir el código desmontado:

    08048410 <add>:
     8048410:   55                      push   ebp
     8048411:   89 e5                   mov    ebp,esp
     8048413:   83 ec 10                sub    esp,0x10
     8048416:   8b 45 08                mov    eax,DWORD PTR [ebp+0x8]
     8048419:   8b 55 0c                mov    edx,DWORD PTR [ebp+0xc]
     804841c:   01 d0                   add    eax,edx
     804841e:   89 45 fc                mov    DWORD PTR [ebp-0x4],eax
     8048421:   8b 45 fc                mov    eax,DWORD PTR [ebp-0x4]
     8048424:   c9                      leave  
     8048425:   c3                      ret    
    

    Este código desmontado muestra el prólogo de la función al principio (empujando el puntero base y configurándolo como el puntero de pila), la asignación de 16 bytes para variables locales (sub esp,0x10) y el epílogo de la función al final (restaurando el puntero base y retornando). En el medio, puedes ver cómo los dos argumentos de entrada se mueven hacia los registros, se suman y se almacenan en una variable local. Luego, la variable local se mueve al registro EAX para ser retornada como resultado de la función.

    Con este código desmontado, puedes explicar la convención de llamada de funciones en C, cómo se pasan los argumentos y cómo se almacenan las variables locales en la pila. Y al deshabilitar el sombreado de pila, puedes mantener la explicación enfocada en estos conceptos fundamentales sin enredarse en funciones de seguridad innecesarias.

Comments are closed.