У меня есть следующий код для имитации переполнения буфера.Переполненные данные буфера не сохраняются смежно
Редактировать: Я пропустил важный шаг в коде ниже. По мере того, как обсуждение прогрессировало, изменяется переменная c.
void function (int fd, int e)
{
int i = 0;
int n;
char c;
char s[44];
.
.
c = getchar(fd);
.
//Some check on c
s[i++] = c;
.
//Some more local variables and some operations on them.
}
Я пытаюсь переполнение буфера, посылая больше входного> 4 байта для того, чтобы увидеть, как локальные переменные и EBP и RET и аргументы модифицируются.
Однако, когда я отлаживаю в GDB, чтобы увидеть фрейм стека, этот буфер переполняется, и переполненные данные, похоже, не выделяются смежными ячейками памяти.
Buffer базовый адрес: 0xbfff fdb3 Адрес C: 0xbfff БДЛФ Адрес I: 0xbfff fde0
Как вы можете видеть, моя строка ввода содержит множество NOP (в \ X90), то множество элементов а (\ x41). В кадре стека GDB вы можете видеть, что 1-й 4-й байт буфера заполняется смежно, как и ожидалось, тогда часть избыточных данных также заполняется смежно. от (address: 0xbffffddc onwards till 0xbffffdfc)
Но это еще не все данные. Затем есть некоторые другие данные между ними и снова моя входная строка видна с address 0xbffffe1c to 0xbffffe2c.
SO буфер, хотя и переполняется, переполненные данные не сохраняются в смежных местах. Как я могу заставить данные переполнения храниться в непрерывных местах?
PS: На моей машине Ubuntu, 32-битной,
Что latform вы используете? Я смутно помню, как читал о различных контрмерах, которые некоторые ОС используют, чтобы сделать такие атаки сложнее, рандомизировать места памяти и т. Д. Я знаю, что OpenBSD многое делает. –
Я думаю, что этот эффект связан с канарейками, используемыми для представления атаки переполнения буфера. Но я еще не придумал правильного объяснения. – Haris
Скомпилируйте свой код без защиты стека, например. в GCC '-fno-stack-protector'. В Visual Studio отключите защиту, добавив '/ GS-' – 0x90