вопрос под x86-инструкция - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, что у нас есть следующий код c

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

Затем мы скомпилируем его в режиме отладки и получим следующий код дизассемблирования:

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

Хорошо, мы просто обсудим:

sub esp, 0xc0

Мой вопрос: почему здесь используется значение по умолчанию 0xc0, а не другое значение, такое как 0xF0, 0xFF… и т. Д.?

1 Ответ

0 голосов
/ 18 декабря 2018

Это стандартная настройка фрейма стека, сохраняющая указатель стека с последующим использованием EBP для индексации.Сумма, вычитаемая из ESP, - это то, что выделено для хранения локальной переменной процедуры, и к локальным переменным можно обратиться, ссылаясь на [EBP - ??].

Не видя код вашей процедуры, трудно сказать, почемуэто выделяет столько памяти.Нет значения по умолчанию, используемого компилятором, он всегда выделяет именно то, что нужно.Это может быть сделано, потому что типы локальных переменных должны быть явно объявлены, и компилятор знает, сколько места используется каждым типом.В этом нет никакой случайности или неопределенности, и нет никакой выгоды в распределении дополнительной памяти.Я также не вижу, как рандомизация размера хранилища локальной переменной предотвратит любую атаку на основе стека.В большинстве современных процессоров предусмотрены меры по предотвращению выполнения данных, что делает эти атаки невозможными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...