Basiswissen Buffer Overflow

14.05.2004
Von Thomas Wölfer

handelt es sich bei der Variablen temporaer um eine solche lokale Variable. Der Speicher für temporaer befindet sich also im Stack. Beim Einsprung in die Funktion merkt sich der Binärcode zunächst den aktuellen Wert des SP. Das ist die dann die Adresse von temporaer. Da die Variable 10 Bytes belegt, wird der SP dann um 10 erhöht: So ist genug Platz für die Variable. Danach kann die Funktion abgearbeitet werden.

Nun kommt der Trick: Nach dem Aufruf einer Funktion soll das Programm ja mit der nächsten Instruktion nach dem JMP weiter ausgeführt werden. Diese Instruktion hat natürlich auch eine Adresse: Man nennt dies die Rücksprungadresse.

Was nun einfach passiert ist, dass diese Adresse vor dem Aufruf einfach auf den Stack geschoben wird. Hat die aufgerufene Funktion Parameter, werden diese zusätzlich auf dem Stack abgelegt. Dann wird die Funktion per JMP aufgerufen.

In der Funktion angelangt, nimmt der Binärcode alle erwarteten Parameter - nicht aber die Rücksprungadresse - vom Stack. Der SP zeigt dann auf die Rücksprungadresse im Stack. Danach wird der SP für die lokalen Variablen der Funktion erhöht. Man hat dann also in etwa das folgende Bild im Speicher:

Stack: Ein theoretischer Stack mit Rücksprungadresse, lokaler Variable und Stackpointer (SP).