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?
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:
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:
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.