Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Локальный буфер



Возьмем, например, программу-дрозофилу:

main(int argc, char *argv[])

{

process_data(argv[1]):

}

#define FIXED 16 process_data (char *data)

{

char buf[FIXED],

strcpy (buf, data):

return:

}

Для нее стек после вызова process_data() будет выглядеть примерно так, как это показано на рис. 9.1.

Рис. 9. 1. Состояние стека после вызова уязвимой функции

Теперь уже не надо быть суперхакером, чтобы заметить, что адрес возврата находится не только в одном

Сегменте с локальными переменными, но и имеет больший адрес. Тогда, передав в качестве данных строку,

Имеющую заведомо больший размер, чем у отведенного под ее обработку буфера, мы сможем затереть все,

Что лежит в памяти выше, чем этот буфер, так как функция strcpyO будет копировать данные до тех пор,

пока не встретит нуль-символ '\0'. В нашем примере достаточно передать как входной параметр строку

Длиной более 15 байт для выхода за границу буфера плюс еще несколько байт для изменения собственно

Адреса возврата.

Не случайно в приведенных выше рассуждениях ни разу не встретилось упоминания о конкретной

Операционной системе. Действительно, технология переполнения локального буфера весьма универсальна и

Будет работать практически в любой ОС (об ограничениях чуть ниже), поэтому читатель может

Скомпилировать программу-дрозофилу в его любимой ОС и посмотреть на результат, подав на вход, скажем,





Дата публикования: 2014-11-04; Прочитано: 378 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...