He leído que la pila generalmente comienza en la misma dirección para que el atacante pueda adivinar el punto de inicio del búfer para desbordarse. Esto es necesario para conocer esta dirección para que se ejecute el código malicioso. Hice un programa con unas pocas líneas de código para obtener la dirección del puntero de la pila cada vez que se inicia e imprimirlo en la pantalla:
int * get_stack_pointer(){
__asm__("mov %esp,%eax");
}
void main(){
printf("Address: %p\n",get_stack_pointer());
}
Y esto es desmontaje del programa:
<get_stack_pointer>:
push %rbp
mov %rsp,%rbp
mov %esp,%eax
pop %rbp
retq
<main>:
push %rbp
mov %rsp,%rbp
mov $0x0,%eax
callq 40050c <get_stack_pointer>
mov %rax,%rsi
mov $0x4005ec,%edi
mov $0x0,%eax
callq 4003e0 <printf@plt>
pop %rbp
retq
Pero cada vez que comienzo el programa obtengo diferentes direcciones. Algunos de estos son los siguientes:
Address: 0xc31b2c80
Address: 0x2e041e0
Address: 0x7b003190
Address: 0xb3fd1350
Entonces, en este caso, ¿cómo es posible que el atacante ejecute su código en el programa vulnerable? (Mi sistema operativo es Linux 64bit)
EDITAR: Hice otro programa en ensamblaje que incluye algunas líneas simples. Solo reviso el valor de RSP cada vez que comienza con el depurador y veo que siempre RSP tiene el mismo valor pero no el programa escrito en c.