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 [[sistema operativo|sistemi operativi]] e compilatori 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/x86 (senza protezioni) ===
<source lang="c">
#include <string.h>
int main(int argc, char *argv[])
{
char buf[16];
strcpy(buf, argv[1]);
};
</source>
Se <code>0xbffff7c4</code> è l'indirizzo di memoria di <code>buf</code>, allora:
<source lang="text">
# gdb --args ./test `perl -e 'print "\xc8\xf7\xff\xbf"x7'`
[...]
Program received signal SIGSEGV, Segmentation fault.
0xbffff7e0 in ?? ()
</source>
redirige l'esecuzione alla locazione <code>0xbffff7c8</code>. Questo perché:
* la settima word da 4 byte sovrascrive l'indirizzo di ritorno in <code>0xbffff7dc</code>; quest'ultimo verrà quindi prelevato da <code>0xbffff7c8 + 4 = 0xbffff7cc</code>
* all'indirizzo <code>0xbffff7cc</code> (la terza word della stringa in <code>buf</code>) è presente il valore <code>0xbffff7c8</code>; questo diventerà il nuovo [[program counter]]
Inoltre, nell'esempio di cui sopra:
* in <code>0xbffff7c8</code> abbiamo il valore <code>0xbffff7c8</code>, corrispondente all'istruzione assembly <code>enter 0xfff7,0xbf</code>, ripetuta fino all'indirizzo <code>0xbffff7dc</code>
* in <code>0xbffff7e0</code> (la locazione della prima istruzione successiva a quella in <code>0xbffff7dc</code>) incontriamo casualmente un riferimento ad un indirizzo non valido, con conseguente [[segmentation fault]].
{{Portale|Sicurezza informatica}}
|