Sto giocando con un esempio di overflow dello stack. Questo esempio è il seguente:Dillema con buffer overflow
void return_input (void){
char array[30];
gets (array);
printf("%s\n", array);
}
main() {
return_input();
return 0;
}
Tutto questo codice si trova nel file overflow.c. Abbiamo una funzione vulnerabile denominata return_input, in particolare è un array di 30 byte char. Ho compilato e aprii la funzione vulnerabile gdb ed ho ottenuto seguente output:
(gdb) disas return_input
0x08048464 <+0>: push %ebp
0x08048465 <+1>: mov %esp,%ebp
0x08048467 <+3>: sub $0x48,%esp
0x0804846a <+6>: mov %gs:0x14,%eax
0x08048470 <+12>: mov %eax,-0xc(%ebp)
0x08048473 <+15>: xor %eax,%eax
0x08048475 <+17>: lea -0x2a(%ebp),%eax
0x08048478 <+20>: mov %eax,(%esp)
0x0804847b <+23>: call 0x8048360 <[email protected]>
0x08048480 <+28>: lea -0x2a(%ebp),%eax
0x08048483 <+31>: mov %eax,(%esp)
0x08048486 <+34>: call 0x8048380 <[email protected]>
0x0804848b <+39>: mov -0xc(%ebp),%eax
0x0804848e <+42>: xor %gs:0x14,%eax
0x08048495 <+49>: je 0x804849c <return_input+56>
0x08048497 <+51>: call 0x8048370 <[email protected]>
0x0804849c <+56>: leave
0x0804849d <+57>: ret
End of assembler dump.
Come si può vedere dalla funzione di prologo abbiamo riservato hex48 (dec 72) byte sullo stack per le variabili locali. Prima stavo cercando di trovare l'indirizzo in cui il nostro array vulnerabile inizia in pila. Penso che sia -0x2a (% ebp), ho ragione? Hex2a è 42 decimali. Come ho capito significa che possiamo scrivere in modo sicuro 42 byte prima di iniziare a sovrascrivere EBP salvato nello stack. Ma quando ho eseguito questo esempio è sufficiente solo a destra 37 byte per ottenere errore di segmentazione:
[email protected]:~/temp/ELF_reader$ ./overflow
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
Come è di 37 byte sufficiente a buffer overflow? Se il nostro char array locale è -42 byte da EBP salvato
Non correlato, ma [questa domanda] (http://stackoverflow.com/questions/9249315/what-is-gs-in-assembly) è * estremamente * simile. – huon
In C, la scrittura di 31 byte in un array di 30 byte è sufficiente per l'overflow di tale array (e causa comportamento non definito). – pmg