sub-x86 instrukcja pytanie

głosy
0

Załóżmy, że mamy następujący kod c

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

Następnie musimy skompilować go w trybie debugowania, otrzymujemy następujący kod rozbierać:

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

Ok, po prostu omówić:

sub esp, 0xc0

Moje pytanie brzmi: dlaczego to wartość domyślna tutaj 0xc0, a nie inne wartości, takie jak 0xF0, 0xFF... i tak dalej?

Utwórz 18/12/2018 o 10:04
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Jest to standardowa konfiguracja ramki stosu, oszczędności wskaźnik stosu następnie używając EBP do indeksowania. Kwota odejmowana od ESP jest to, co jest przydzielona dla pamięci lokalnej zmiennej procedura, a zmienne lokalne będą dostępne poprzez odniesienie [EBP- ??].

Nie widząc kod do procedury trudno powiedzieć dlaczego przydziela że dużo pamięci masowej. Nie ma domyślnie używany przez kompilator, to zawsze przydziela dokładnie to, co jest potrzebne. To może to zrobić, ponieważ typy zmienne lokalne muszą być wyraźnie zadeklarowane, a kompilator wie, jak dużo miejsca jest wykorzystywany przez każdego typu. Nie ma przypadkowości lub niepewność w nim, a nie korzyści dla alokacji dodatkowej pamięci masowej. Ja też nie mogę zobaczyć, jak losowanie lokalną zmienną wielkość pamięci uniemożliwiałyby każdy rodzaj ataku opartego na stosie. Większość nowoczesnych procesorów mieć środki zapobiegania wykonywaniu danych sprzętowych w miejscu, co czyni te ataki i tak niemożliwe.

Odpowiedział 18/12/2018 o 11:43
źródło użytkownik

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