2015-11-14 4 views
2

У меня есть следующий код для имитации переполнения буфера.Переполненные данные буфера не сохраняются смежно

Редактировать: Я пропустил важный шаг в коде ниже. По мере того, как обсуждение прогрессировало, изменяется переменная 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-битной,

+0

Что latform вы используете? Я смутно помню, как читал о различных контрмерах, которые некоторые ОС используют, чтобы сделать такие атаки сложнее, рандомизировать места памяти и т. Д. Я знаю, что OpenBSD многое делает. –

+0

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

+0

Скомпилируйте свой код без защиты стека, например. в GCC '-fno-stack-protector'. В Visual Studio отключите защиту, добавив '/ GS-' – 0x90

ответ

2

Когда вы объявили ваши переменные

int i = 0; 
    int n; 
    char c; 
    char s[4]; 

предполагая, что стек переполняется «вверх» прошлого c, вы полагаетесь на предположении, что не может быть истинным, т. е. что переменные сразу смежны в стеке. Это может быть неверным, поскольку между переменными может быть «защита стека» или «стекающая канарейка».

Чтобы узнать больше об этом, обратите внимание на "стек гвардии" и "стек канареек":

+0

Я знал это. Но согласно первой ссылке и тому, что я знаю * ... Stack Guard записывает канарейское слово между локальными переменными и обратным адресом в стеке, перед вызовом функции, и проверяет его непосредственно перед возвратом функции ... *. Это означало бы, что между обратным адресом и переменными есть канарейка, и когда переполнение буфера будет завершено, эта канарейка будет перезаписана (это то, как обнаружены атаки переполнения буфера). Но здесь канарейка не перезаписывается. – Haris

+0

Вы можете получить больше информации, написав другой байт в каждом месте, т. Е. Счетчик, чтобы вы могли сравнить его с адресами местоположения. –

+0

Я не думаю, что это отвечает на вопрос ОП. – Haris

 Смежные вопросы

  • Нет связанных вопросов^_^