Ho un pezzo di codice che contiene un ovvio buffer overflow a strcpy(buf, x)
poiché non controlla se buf
è abbastanza grande da contenere la stringa x
. Mi sto chiedendo come sfruttare questo bug.
void fun(char *x) {
char buf[10];
strcpy(buf, x);
printf("You gave me this: %s", buf);
exit(0);
}
Ed ecco come viene chiamata la funzione da main:
fun(argv[1]);
La tecnica classica per sfruttare un buffer overflow nello stack sovrascrive l'indirizzo di ritorno con un puntatore al codice shell. Questo eseguirà il codice shell una volta che ret
pop modifica l'indirizzo di ritorno dallo stack e lo salta. Ma questa tecnica non funzionerà qui perché la funzione fun
non viene restituita. Invece, viene eseguito exit(0)
.
Inoltre, non posso eseguire un attacco di stringa formato perché printf
viene usato in modo sicuro (credo). All'inizio pensavo che questo non potesse essere sfruttato. Poi ho fatto qualche ricerca e ho scoperto la speleologia del codice. Ma il problema è che la speleologia del codice richiede la modifica del file binario.
Quindi, la mia domanda è possibile sfruttare l'overflow del buffer nel codice precedente? In caso contrario, quali altre tecniche possono essere utilizzate dato che non esiste un altro codice vulnerabile in main()
?
PS: Linux, 32-bit, Intel. Supponi che nessuna protezione come ASLR ecc. sia attiva .
PS: lo exploit dovrebbe comportare l'ottenimento di una shell di root .