Durante la escritura de algunos desafíos básicos, descubro que las vulnerabilidades no funcionan si no se lanzan en GDB. Para probar este comportamiento, el siguiente programa imprime los valores de registro y la dirección del código:
#include <stdint.h>
intptr_t esp;
intptr_t ebp;
void call_me()
{
asm("movl %%esp, %0" : "=r" (esp) );
asm("movl %%ebp, %0" : "=r" (ebp) );
printf("call_me: %8x\n", call_me);
printf("esp: %8x\n", esp);
printf("ebp: %8x\n", ebp);
}
int main(char *argv[], int argc)
{
call_me();
}
Cuando se compila con -fno-stack-protector
y -z execstack
y se ejecuta con ASLR deshabilitado ( kernel.randomize_va_space=0
), el programa devuelve:
call_me: 804841c
esp: bffff720
ebp: bffff738
Pero cuando se ejecuta dentro de GDB, el programa devuelve:
call_me: 804841c
esp: bffff6f0
ebp: bffff708
¿Por qué las diferencias de 0x30 para $ esp y $ ebp? ¿GDB agrega algo?