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^^
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^^
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 316871
Url: https://administrator.de/contentid/316871
Ausgedruckt am: 14.11.2024 um 13:11 Uhr
1 Kommentar
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:
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
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
Grüße Dieter