Ricostruire il funzionamento di un software è un’attività complessa e dispendiosa. Spesso la lingua di programmazione è costituita da diverse migliaia di righe di codice sorgente, che vengono rese ancor più impenetrabili da ramificazioni e funzioni integrate. Inoltre, una volta compilato, il codice sorgente deve essere ricostruito (ossia decompilato), operazione che non sempre è possibile.
Il fuzzing persegue pertanto un approccio diverso: genera tutti i dati casuali immaginabili di un determinato tipo, in modo tale da coprire il massimo numero possibile di varianti di input. Il fuzzing rappresenta l’interfaccia per l’input automatizzato. Questo può avvenire a diversi livelli. Nell’ambito dell’application fuzzing, ad esempio, si simulano diversi tipi di dati, che in seguito sono inoltrati a un software. Il test può essere eseguito anche su possibili lunghezze e formati di dati degli input. Il protocol fuzzing utilizza pacchetti di dati creati autonomamente. Un’altra possibilità consiste nell’intercettare dei contenuti, manipolarli e restituirli. Il file format fuzzing funziona invece con file di test generati casualmente. I fattori da testare sono, ad esempio, la dimensione, la struttura e i marcatori (flag) utilizzati.