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-Key: 316871

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

Printed on: April 25, 2024 at 16:04 o'clock

Mitglied: 116301
Solution 116301 Oct 04, 2016, updated at Oct 05, 2016 at 07:01:11 (UTC)
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