Выравнивание стека - тестирование переполнения буфера - PullRequest
0 голосов
/ 21 октября 2018

Я провел много исследований, пытаясь понять эту тему, но все еще путаюсь.В настоящее время я изучаю переполнение буфера.Вот пример функции, на которую я смотрю:

int testFunction(char* sourceBuffer)
{
    unsigned char result = 0;
    char destinationBuffer[512];

    //do some insecure stuff with strcpy()
}

Я компилирую с этими настройками:

gcc -g -z execstack -fno-stack-protector -o test test.c

Из того, что я могу сказать, ASLR, защита стека, канареечные значенияи защита компилятора должна быть отключена с этими настройками.Однако после проверки памяти в GDB мой стек выглядит следующим образом:

HIGH

sourceBuffer...temp...etc...
RET address [4 bytes]
EBP address [4 bytes]

(8 bytes of mystery memory)

result [1 byte]
destinationBuffer[512 bytes]

LOW

Я пытался прочитать о выравнивании / заполнении стека, эта статья была особенно полезна: Распределение, заполнение и выравнивание стека

Выравнивание по умолчанию составляет 16 байтов.Согласно этому ответу, если я изменю n = 2, похоже, что это работает.result составляет всего 1 байт до того, где начинается указатель EBP.Это позволит мне использовать переполнение буфера в обратном адресе, как я хочу.

Мне действительно тяжело, как это работает.Если по умолчанию это 16, изначально ли стек настроен с 16 байтами, тогда указатели RET и EBP занимают 4 байта каждый, так что осталось только 8 байтов?Я просто растерялся, понимая это.

1 Ответ

0 голосов
/ 24 октября 2018

Ваш стек выровнен на 16 байтов.Если имеется 4 байта RET и 4 байта EBP, то вам, конечно, понадобится еще 8 байтов, чтобы поддержать это 16-байтовое выравнивание, иначе хранилище локальной функции не будет начинаться с кратных 16 байт, и тогда ваш стек не будет 16выровненный байт.

...