Questo libro considera il problema della generazione automatica di exploit per le vulnerabilità del software. Una definizione formale del termine "exploit" verrà fornita nel Capitolo 2 ma, in modo informale, si descrive un exploit come un input di programma che porta all'esecuzione di codice maligno1. Per codice dannoso si intende una sequenza di byte iniettata da un aggressore nel programma che sovverte la sicurezza del sistema preso di mira. Questo codice è tipicamente chiamato shellcode. Gli exploit di questo tipo spesso sfruttano gli errori dei programmatori relativi alla gestione della memoria o alla tipizzazione delle variabili nelle applicazioni sviluppate in C e C++. Questi errori possono portare a buffer overflow, in cui vengono scritti troppi dati in un buffer di memoria, con conseguente corruzione di posizioni di memoria non volute. Un exploit sfrutterà questa corruzione per manipolare posizioni di memoria sensibili con l'obiettivo di dirottare il flusso di controllo dell'applicazione.