Basiswissen Buffer Overflow

14.05.2004
Von Thomas Wölfer

Das Beispielprogramm ruft nun aber nicht Puts() auf. Stattdessen führt es einen weiteren Aufruf von strcpy() aus, mit dem der Vorname kopiert wird. Vorname hat die Adresse 15 und ab dieser Adresse platziert strcpy() dann auch die Zeichen des Vornamens. Nach dem zweiten strcpy() sieht der Speicherinhalt also wie folgt aus:

Zeichensalat: Nun wird je nach ausgegebener Variable nur noch Unsinn angezeigt.

Der zweite Aufruf von strcpy() überschreibt also Teile des Namens. Auch das ist aber genau das, was im Programm angeordnet wurde, denn das sagt ganz klar aus: Schreibe die Zeichenfolge "Heinz" in den Speicher und beginne mit der Adresse 15.

Name: Nicht erkennbar

Abgesehen davon, dass Teile des Namens überschrieben wurden, hat diese Sache aber noch einen zweiten Effekt: Im Zuge des Überschreibens liegt die abschließende Null des Namens hinter der des Vornamens. Dadurch ist das tatsächliche Ende des Namens für die Funktion Puts() nicht mehr zu erkennen. Der folgende Aufruf von