Stack overflow
eccessiva richiesta di memoria in un sistema informatico
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
#include <stdio.h>
#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.