Cómo desactivar la optimización del compilador gcc para permitir el desbordamiento del búfer
Estoy trabajando en un problema de tarea que requiere deshabilitar la protección de optimización del compilador para que funcione. Estoy usando gcc 4.4.1 en ubuntu linux, pero no puedo determinar cuáles son las banderas correctas. Me doy cuenta de que depende de la arquitectura: mi máquina funciona con un procesador Intel de 32 bits.
Gracias.
Ese es un buen problema. Para resolver ese problema también tendrás que desactivar ASLR, de lo contrario la dirección de g() será impredecible.
Desactivar ASLR:
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
Desactivar canarios:
gcc overflow.c -o overflow -fno-stack-protector
Después de desactivar canarios y ASLR, debería ser un ataque sencillo como los descritos en Smashing the Stack for Fun and Profit.
Aquí hay una lista de características de seguridad utilizadas en ubuntu: https://wiki.ubuntu.com/Security/Features No tienes que preocuparte por los bits NX, la dirección de g() siempre estará en una región ejecutable de la memoria. porque está dentro del segmento de memoria de TEXTO. Los bits NX solo entran en juego si intenta ejecutar shellcode en la pila o el montón, lo cual no es necesario para esta tarea ya que utiliza programación orientada al retorno (ROP o cadena ROP), que se usa comúnmente para anular la protección proporcionada por el bit NX.
¡Ahora ve y golpea ese EIP !
Urm, todas las respuestas hasta ahora han sido incorrectas y la respuesta de Rook es correcta.
Entrando:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Seguido por:
gcc -fno-stack-protector -z execstack -o bug bug.c
Desactiva ASLR, SSP/Propolice y NoneXec de Ubuntu (que se colocó en 9.10 y es bastante sencillo de solucionar; consulte la técnica mprotect(2) para asignar páginas como ejecutables y jmp) debería ayudar un poco, sin embargo, estas "funciones de seguridad" son De ninguna manera es infalible. Sin el indicador `-z execstack', las páginas tienen marcas de pila no ejecutables.