die Unter x86-Instruktion Frage

stimmen
0

Nehmen wir an, wir die folgende C-Code haben

void fun(void){
    printf(this is fun\n);
}

Dann haben wir es mit dem Debug-Modus kompilieren, erhalten wir den folgenden disassemble Code:

push ebp
mov ebp,esp
sub esp, 0xc0
...

Ok, wir nur zu diskutieren:

sub esp, 0xc0

Meine Frage ist: Warum ist der Standardwert hier 0xc0, nicht der andere Wert, wie 0xF0, 0xFF... und so weiter?

Veröffentlicht am 18/12/2018 um 10:04
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Dies ist ein Standard-Stack-Frame-Setup, das Speichern der Stapelzeiger dann für die Indizierung mit EBP. Die Menge von ESP abgezogen ist, was für das Verfahren der lokalen Variablenspeicher zugeordnet ist, und lokale Variablen werden durch Bezugnahme auf [EBP- ??] zugegriffen werden.

Ohne den Code für Ihre Verfahren zu sehen, ist es schwer zu sagen, warum ordnet es so viel Speicher. Es gibt keinen Standardwert vom Compiler verwendet wird, es immer genau zuordnet, was gebraucht wird. Es kann dies tun, weil lokalen Variablen-Typen müssen explizit deklariert werden, und der Compiler weiß, wie viel Speicherplatz von jedem Typ verwendet wird. Es gibt keine Zufälligkeit oder Unsicherheit darin, und keinen Nutzen für zusätzlichen Speicherplatz zuweisen. Ich kann auch nicht sehen, wie die lokale Variable Speichergröße Randomisierung jede Art von Stack-basierten Angriff verhindern würde. Die meisten modernen Prozessoren Hardware-Data Execution Prevention Maßnahmen getroffen, trotzdem diese Angriffe unmöglich macht.

Beantwortet am 18/12/2018 um 11:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more