Ho letto che lo stack di solito inizia nello stesso indirizzo in modo che l'attaccante possa indovinare il punto di partenza del buffer da traboccare. È necessario conoscere questo indirizzo per eseguire il codice dannoso. Ho creato un programma con poche righe di codice per ottenere l'indirizzo del puntatore dello stack ogni volta che viene avviato e stampato sullo schermo:
int * get_stack_pointer(){
__asm__("mov %esp,%eax");
}
void main(){
printf("Address: %p\n",get_stack_pointer());
}
E questo è lo smontaggio del programma:
<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
Ma ogni volta che avvio il programma ottengo diversi indirizzi. Alcuni di questi sono i seguenti:
Address: 0xc31b2c80
Address: 0x2e041e0
Address: 0x7b003190
Address: 0xb3fd1350
Quindi in questo caso come è possibile che l'attaccante esegua il suo codice sul programma vulnerabile? (il mio sistema operativo è Linux a 64 bit)
EDIT: ho creato un altro programma in assembly che include poche righe semplici. Ho appena controllato il valore di RSP ogni volta che si avvia con il debugger e vedo sempre che RSP ha lo stesso valore ma non il programma scritto in c.