stefaon
Goto Top

EBP im Stack speichern- wofür?

In Anlehnung zum Artikel ( https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-par ... ) stellt sich mir folgende Frage:

Wenn ich eine neue Funktion erstelle, macht er zuerst die Übergabeparameter, dann einen EIP, dann EBP. Der EBP verweist aber auf ESP, also auf das derzeit (hier) höchste Stapelblatt.
Dann wird der Stack evtl. erhöht, wenn Variablen kommen oder neue Fkt hinzugefügt werden.
Ein LEAVE-Assembly, lässt dann in den EIP rein springen und zugleich den EBP. Aber es macht doch keinen Sinn, wenn man den EBP abspeichert?


Ich hoffe mich versteht jemand^^

Content-ID: 316871

Url: https://administrator.de/contentid/316871

Ausgedruckt am: 25.11.2024 um 14:11 Uhr

116301
Lösung 116301 05.10.2016 aktualisiert um 09:01:11 Uhr
Goto Top
Hallo StefaOn!

Doch, der EBP ist wie der ESP ein Stackzeiger, wobei der ESP auf die aktuelle Adresse zum Zeitpunkt des Proc-Aufrufs zeigt. Auf die Übergabeparameter (ARG), und die Variablen die innerhalb der aufgerufenen Proc deklariert werden (LOCAL) kann nur über den EBP zugegriffen werden, der die richtige Bezugsadresse zum Zeitpunkt des Aufrufs erhält, da der ESP ja kein konstanter Bezugspunkt ist (neue Push/Pop)...

Der ESP hat zum Programmstart die höchstmögliche Adresse und bewegt sich Schrittweise von oben nach unten gegen 0. Das bedeutet ein [EBP+Offset] zeigt auf die Übergabeparameter (ARG) und ein [EBP-Offset] zeigt auf die Variablen (LOCAL), die innerhalb der Proc deklariert werden.

Von daher beim Aufruf mit 2 Word-Argumenten:
push    ebp                     ;Sichern
mov     ebp, esp                ;Aktuelle Stackadresse
mov     ax, word ptr [ebp+6]    ;Argument 2
mov     dx, word ptr [ebp+8]    ;Argument 1
pop     ebp                     ;Restaurieren
Beim Ret muss der EBP natürlich wieder restauriert werden, damit der Zeiger beim Rücksprung wieder auf die richtige Stackadresse bzw. Variablen zeigt...

Grüße Dieter