Ho questo semplice codice
vuln.c
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char buffer[500];
strcpy(buffer, argv[1]);
printf("%s", buffer);
return 0;
}
Sto tentando di eseguire un buffer overflow e
- Riempi il buffer con un codice dannoso
- Modifica l'indirizzo di ritorno per reindirizzare il codice dannoso
Idealmente, credo che quando sovrascrivo il mio buffer da 500, successivamente sovrascriverò il puntatore di base, seguito dall'indirizzo di ritorno.
Ecco come ho provato a sovrascrivere il buffer
gcc vuln.c
./a.out $(python -c 'print "\x41" * 501')
Dato che sto mettendo 501 "A" nel buffer, dovrebbe overflow teoricamente, giusto? Ma questo non sta succedendo. Non ottengo un errore di segmentazione, invece, ottengo l'output di "AAAA .." e il programma esce normalmente. (Non ho contato il numero di As ..).
Quindi ho attivato GDB e ho iniziato a giocare con il numero di As finché I do non ha riscontrato un errore di segmentazione. E trovo che ottengo un errore di segmentazione quando inserisco 520 "A"! Come?
Con 520 A's, GDB's info registers
mi dà
Econ521A,conlostessocomandoGDB,ottengo
Come puoi vedere, nell'immagine 1, il punto base viene riempito con \ x41 (esadecimale per A) e nell'immagine 2, il BP è riempito con \ x41s e anche l'IP inizia a essere riempito.
Non lo capisco. Quindi la mia domanda è: perché 520? E perché non ha overflow su 501?