<aside> đźš©
Stack4 riguarda la sovrascrittura del saved EIP e buffer overflow
</aside>
EIP = registro che contiene l’indirizzo della prossima istruzione da eseguire
Sorgente:
win
→ stampa un messaggio di successo, non viene chiamata nel flusso del programmamain
→ crea un buffer di 64 byte e usa gets
per leggere input dall’utente#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void win()
{
printf("code flow successfully changed\\n");
}
int main(int argc, char **argv)
{
char buffer[64];
gets(buffer);
}
L’obiettivo della sfida è eseguire la funzione win
a tempo di esecuzione
Il programma accetta input locali da tastiera o da altro processo, l’input è una stringa generica
Ci chiediamo se è possibile dare al programma un input tale da eseguire la funzione win
Dato che non c’è una variabile esplicita da sovrascrivere, abbiamo bisogno di trovare una locazione di memoria che, se sovrascritta, provoca una modifica del flusso di esecuzione
→ Possiamo usare la cella “indirizzo di ritorno” (dimensione pari all’architettura cioè 4 byte) nello stack frame corrente, che contiene l’indirizzo della prossima istruzione da eseguire al termine della funzione descritta nello stack frame
Idea: sovrascrivere l’indirizzo di ritorno con quello di win
→ per farlo dobbiamo identificare:
win
Eseguiamo stack4 mediante gdb per determinare il layout dello stack gdb /opt/protostar/bin/stack4
Iniziamo con il recupero dell’indirizzo di win
con p win