Durante la scrittura di alcune sfide di base, scopro che gli exploit non funzionano se non vengono lanciati in GDB. Per verificare questo comportamento, i seguenti valori del registro di stampa del programma e l'indirizzo del codice:
#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();
}
Se compilato con -fno-stack-protector
e -z execstack
e in esecuzione con ASLR disabilitato ( kernel.randomize_va_space=0
) il programma restituisce:
call_me: 804841c
esp: bffff720
ebp: bffff738
Ma quando si esegue all'interno di GDB, il programma restituisce:
call_me: 804841c
esp: bffff6f0
ebp: bffff708
Perché le differenze 0x30 per $ esp e $ ebp? GDB aggiunge qualcosa?