-Slash
17-01-2012, 23:47
Ciao a tutti :D
Sto cercando di capire come funzionano gli stack buffer overflow. Sulla rete ho trovato questo (http://www1.maths.leeds.ac.uk/~read/bofs.html) link che sembra spiegare per bene come funziona il tutto. Ad un certo punto mette questo esempio:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
Secondo lui (o meglio secondo quello che ho capito) il risultato della printf dovrebbe essere 0, perchè è stato modificato il puntatore all'indirizzo di ritorno della funzione in modo da saltare l'istruzione x=1. Tuttavia a me non funziona e ritorna 1 normalmente, presumo perchè il codice è scritto per una architettura x86 mentre invece siamo passati ai 64 bit, e quindi lo sfasamento di ret è diverso. La domanda è: qual è questo sfasamento? :D
Prima lui diceva che buffer1 occupava 8 byte (presumo per mantenere allineato alla word il resto dello stack) ed il frame pointer occupava 4 byte. Ora teoricamente penso che buffer1 abbia la stessa dimensione, ma il frame pointer occupi 8 byte essendo l'architettura a 64 bit. Tuttavia mettendo 16 continua a non funzionare quindi deve esserci qualcosa che mi sfugge.. :)
Su macosx inoltre il programma viene eseguito correttamente mentre su windows ritorna 1 e poi si chiude dando un errore...
Sto cercando di capire come funzionano gli stack buffer overflow. Sulla rete ho trovato questo (http://www1.maths.leeds.ac.uk/~read/bofs.html) link che sembra spiegare per bene come funziona il tutto. Ad un certo punto mette questo esempio:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
Secondo lui (o meglio secondo quello che ho capito) il risultato della printf dovrebbe essere 0, perchè è stato modificato il puntatore all'indirizzo di ritorno della funzione in modo da saltare l'istruzione x=1. Tuttavia a me non funziona e ritorna 1 normalmente, presumo perchè il codice è scritto per una architettura x86 mentre invece siamo passati ai 64 bit, e quindi lo sfasamento di ret è diverso. La domanda è: qual è questo sfasamento? :D
Prima lui diceva che buffer1 occupava 8 byte (presumo per mantenere allineato alla word il resto dello stack) ed il frame pointer occupava 4 byte. Ora teoricamente penso che buffer1 abbia la stessa dimensione, ma il frame pointer occupi 8 byte essendo l'architettura a 64 bit. Tuttavia mettendo 16 continua a non funzionare quindi deve esserci qualcosa che mi sfugge.. :)
Su macosx inoltre il programma viene eseguito correttamente mentre su windows ritorna 1 e poi si chiude dando un errore...