Stack overflow

eccessiva richiesta di memoria in un sistema informatico
Versione del 29 mar 2009 alle 12:16 di Alez (discussione | contributi) (+stile)

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 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)

#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 0xbffff7c8. Questo perché:

  • la settima word da 4 byte sovrascrive l'indirizzo di ritorno in 0xbffff7dc; quest'ultimo verrà quindi prelevato da 0xbffff7c8 + 4 = 0xbffff7cc
  • all'indirizzo 0xbffff7cc (la terza word della stringa in buf) è presente il valore 0xbffff7c8; questo diventerà il nuovo program counter

Inoltre, nell'esempio di cui sopra:

  • in 0xbffff7c8 abbiamo il valore 0xbffff7c8, corrispondente all'istruzione assembly enter 0xfff7,0xbf, ripetuta fino all'indirizzo 0xbffff7dc
  • in 0xbffff7e0 (la locazione della prima istruzione successiva a quella in 0xbffff7dc) incontriamo casualmente un riferimento ad un indirizzo non valido, con conseguente segmentation fault.


  Portale Sicurezza informatica: accedi alle voci di Wikipedia che trattano di Sicurezza informatica