Estoy tratando de compilar un ejemplo simple de desbordamiento de búfer en una máquina virtual Debian i386. El ejecutable construye bien, pero el EIP no se sobrescribe correctamente a pesar de que se le proporcionó una entrada suficientemente grande para desbordar el búfer y sobrescribir el EIP insertado en la pila. Aquí están mis comandos como root:
sysctl -w kernel.randomize_va_space=0
gcc test.c -z execstack -z norelro -fno-stack-protector -D_FORTIFY_SOURCE=0 -ggdb -o test
Como puedes ver, tengo:
- Hizo el ejecutable de la pila
- Se eliminaron los canarios de pila
- Deshabilitado todo el sistema ASLR
- Se eliminaron las protecciones de relanzado
- Deshabilitó las protecciones FORTIFY_SOURCE de gcc
Aquí está test.c:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char buf[128];
if(argc < 2) return 1;
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
He experimentado con cuerdas de colisión (solo todas las As) de 128-256. En gdb, el EIP empujado nunca se sobrescribe. En realidad, solo debería ser una cadena de 132 bytes para sobrescribir el EIP ya que no hay otras variables de pila locales.
¿Hay alguna otra protección que necesito deshabilitar al compilar? ¿O hay algo más que deshabilitar con sysctl?