Читаем Защита от хакеров корпоративных сетей полностью

Пример программы, уязвимой к переполнению буфера

После изучения основ переполнения буфера пришло время рассмотреть пример программы, извлекающей из него пользу, – программы переполнения буфера. В интересах простоты изучения программа должна быть понятной, а каждый шаг ее работы подробно исследован. Программа написана для платформ Windows NT и Linux.

Программа, уязвимая к переполнению буфера

Главная цель – привести в этой секции пример программы, уязвимой к переполнению буфера. Рассмотренная в этой секции программа очень похожа на последний пример, но вместо постоянной строки входных данных она использует ввод данных пользователя. Это позволило загружать в регистр EIP нужные данные.

Исходный текст программы, уязвимой к переполнению буфера

На последующих рисунках, начиная с рис. 8.17, представлена программа, предназначенная для считывания входных данных из файла в локальную переменную, размещенную в области стека. В результате присваивания этой переменной входных данных происходит переполнение буфера. Управляя входными данными программы, появляется идеальная возможность изучить возможности использования переполнения буфера. В программе вызывается специально написанная для примера функция bof, которая открывает файл «badfile», считывает из него входные данные программы размером 1024 байта, записывает их в восьмибайтовый буфер и закрывает файл. При записи данных в буфер происходят переполнение буфера и порча данных стека, а по завершении функции bof в регистр EIP загружается значение из файла «bad-file». Исследуем работу этой программы в Linux и Windows, приводя для обеих платформ соответствующие примеры.

Рис. 8.17. Пример программы, уязвимой к переполнению буфера

Дизассемблерование

На рисунке 8.18 представлен дизассемблерный вид функции bof. Дизассемблерный вид всей программы на рисунке не показан, поскольку она аналогична предыдущей программе и отличается от нее только функцией bof. При большом размере файла «badfile» во время работы функции fread произойдет переполнение буфера, а команда ret функции bof загрузит в регистр EIP величину из входных данных.

Рис. 8.18. Дизассемблированный вид функции bof

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже