Stack overflow
Uno stack overflow consiste (solitamente) nella sovrascrittura della locazione di memoria interna allo stack contenente l'indirizzo di ritorno oppure la copia del precedente frame pointer (vedi call stack). In modo tale, è possibile forzare il sistema a redirigere il flusso di esecuzione - nel momento del ritorno alla funzione chiamante - ad una locazione di memoria dove ha inizio del codice arbitrario.
I moderni sistemi operativi sono dotati di vari meccanismi di protezione e randomizzazione dello stack, e di riorganizzazione fisica delle variabili sensibili (per evitare la sovrascrittura di puntatori).
Esempio di programma vulnerabile in Linux (senza protezioni)
#include <string.h>
int main(int argc, char *argv[])
{
char buf[16];
strcpy(buf, argv[1]);
};
Se 0xbffff7c4
è l'indirizzo di memoria di buf
, allora:
# gdb --args ./test `perl -e 'print "\xc8\xf7\xff\xbf"x7'`
[...]
Program received signal SIGSEGV, Segmentation fault.
0xbffff7e0 in ?? ()
redirige l'esecuzione alla locazione 0xbffff7cc
. Questo perché:
- la settima word da 4 byte sovrascrive l'indirizzo di ritorno in
0xbffff7dc
; quest'ultimo verrà quindi prelevato da0xbffff7c8 + 4 = 0xbffff7cc
- all'indirizzo
0xbffff7cc
(la terza word della stringa inbuf
) è presente il valore0xbffff7c8
; questo diventerà il nuovo program counter
Inoltre, nell'esempio di cui sopra:
- in
0xbffff7c8
abbiamo il valore0xbffff7c8
, corrispondente all'istruzione assemblyenter 0xfff7,0xbf
, ripetuta fino all'indirizzo0xbffff7dc
- in
0xbffff7e0
(la locazione della prima istruzione successiva a quella in0xbffff7dc
) incontriamo casualmente un riferimento ad un indirizzo non valido, con conseguenteSegmentation fault
.