Ähnlich wie bei Buffer-Overflow zeichnet schlechter Programmierstil für diese Angriffsart verantwortlich.

Folgender Programmcode zur Verdeutlichung:

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {

char (buf[2048] = {0};
strncpy(buf,argv[1],sizeof(buf)-1);
printf(buf);
putchar('\n');
return(0);

}

Folgendes passiert:

# ./code DDDD%x%x
DDDDbffffaa44444444

Der zweite Parameter '%x' gibt in Hex die Speicheradresse bekannt, wo der String abgelegt ist. Wenn Nun das zweite '%x' gegen '%n' getauscht wird, so stützt das betreffende Programm mit einem Seg-Fault ab. BINGO ;-)
Adresse wird überschrieben und das Programm führt den Code aus den der Angreifer ab diesem Speicherbereich abgelegt hat.