Basiswissen Buffer Overflow

14.05.2004
Von Thomas Wölfer

Wenn nun Daten in den Puffer für die lokale Variable geschrieben werden, dann wird der Puffer zunächst ab Adresse 9 voll geschrieben. Folgende Daten für lokale Variable landen dann in Bytes 10, 11, 12 und so weiter in aufsteigender Reihenfolge. Mit anderen Worten: In der Abbildung würden die Daten von links nach rechts in den Puffer geschrieben. Am rechten Rand des Puffers für die lokale Variable befindet sich aber die Rücksprungadresse!

Gibt es also bei den lokaler Variablen einen Buffer Overflow - werden also mehr als 10 Bytes ab der Anfangsadresse der lokalen Variable in deren Puffer kopiert -, dann wird dadurch die Rücksprungadresse überschrieben. Diesen Wert verwendet der Binärcode dann zur Laufzeit für den Rücksprung. Mit anderen Worten: Das Programm wird an einer völlig anderen Stelle weitergeführt, als es das eigentlich sollte.

Im Fall eines normalen Programmierfehlers handelt es sich dabei um einen rein zufälligen Wert: Die CPU liest dann den an dieser Adresse befindlichen Wert und versucht ihn als eine Instruktion zu interpretieren und diese auszuführen. Im Regelfall wird das aber nicht gehen: Das Programm wird an dieser Stelle - oder spätestens ein paar Instruktionen später - abstürzen.

Um damit haben Sie genau den Fall, den ein Angreifer ausnutzen kann, um ein Rechnersystem anzugreifen.

So wird angegriffen

Angenommen ein Angreifer weiß, dass sich in einem Programm ein Fehler befindet, der durch geschicktes Ausnutzen zu einem Buffer Overflow führt. Weiterhin angenommen, der Angreifer kann dieses Programm ganz nach Wunsch selbst mit Daten bestücken: Das ist zum Beispiel immer dann der Fall, wenn es sich um ein Server-Programm handelt oder um irgendeine Komponente, die mit Daten von außerhalb bestückt wird.