Експлоіт переповнення буфера

Переповнення буфера є найбільш популярним способом злому комп’ютерних систем, тому що більшість мов високого рівня змішують у пам’яті програму й дані, використовуючи технологію стекового кадру.

Експлоіт переповнення буфера досягає своєї мети шляхом уведення спеціально підготовлених вхідних даних. Такі дані переповняють виділений буфер і змінюють дані які впливають на дані, розташовані за цим буфером у пам’яті.

Коли динамічний буфер, що представляє собою автоматичний масив, виділяється під час виконання функції, він створюється в стеці під час виклику цієї функції. В архітектурі х86 стек росте від більших адрес до менших, тобто нові дані містяться перед тими, які вже перебувають у стеці.

Наприклад, [DATA] [DATA] […] представляє існуючий стек, а [NEWDATA] – це певне нове значення, яке мікропроцесор помістив у стек:

[NEWDATA] [DATA] [DATA] […]

Записуючі дані в буфер, можна здійснити запис за його межами й змінити дані, що перебувають там. Коли програма викликає функцію, вона поміщає адресу повернення в стек, так що функція знає, куди повертати керування після того, як вона завершиться: [ADDR] [DATA] [DATA] […]

Коли виділяється динамічний буфер, стек росте вліво на розмір буфера. Так, якщо функція починається з оголошення char a[10], результатом буде: [.a…] [ADDR] [DATA] [DATA] […]

При завершенні функції пам’ять, що займає буфер, звільняється, і виконується команда RET. Вона читає адресу повернення зі стека та виконує перехід за цією адресою повертаючи керування туди, звідки була викликана функція. Користувач може підставити як адресу повернення так і певну необхідну йому адресу. Це викличе передачу керування в будь-яку точку програми за його вибором. У результаті потенційно може бути виконаний будь-який довільний код, який цей користувач помістив у дану область пам’яті, з тими привілеями, з якими виконується поточна програма.

Код на [слайд на стор. 53, Lect_8.pdf]

Програму можна випробувати з декількома різними рядками. Рядки розміром в 9 або менше символів не будуть викликати переповнення буфера. Рядки в 10 і більше символів будуть викликати переповнення.

Програма може бути переписаною інакше з використанням функцій strncpy для запобігання переповнення [слайд на стор. 55, Lect_8.pdf]


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: