Я провел много исследований, пытаясь понять эту тему, но все еще путаюсь.В настоящее время я изучаю переполнение буфера.Вот пример функции, на которую я смотрю:
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 байтов?Я просто растерялся, понимая это.