После изучения основ переполнения буфера пришло время рассмотреть пример программы, извлекающей из него пользу, - программы переполнения буфера. В интересах простоты изучения программа должна быть понятной, а каждый шаг ее работы подробно исследован. Программа написана для платформ \Утс1о\У8 N1 и Глпих.

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

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

Исходный текст программы, уязвимой к переполнению буфера На последующих рисунках, начиная с рис. 8.17, представлена программа, предназначенная для считывания входных данных из файла в локальную переменную, размещенную в области стека. В результате присваивания этой переменной входных данных происходит переполнение буфера. Управляя входными данными программы, появляется идеальная возможность изучить возможности использования переполнения буфера. В программе вызывается специально написанная для примера функция Ъо/(), которая открывает файл «ЬаёА1е», считывает из него входные данные программы размером 1024 байта, записывает их в восьмибайтовый буфер и закрывает файл. При записи данных в буфер происходят переполнение буфера и порча данных стека, а по завершении функции Ъо/() в регистр ЕГР загружается значение из файла «Ьаё-/Ие». Исследуем работу этой программы в Глпих и \Утс1о\У8, приводя для обеих платформ соответствующие примеры.

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

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

Дизассемблированный вид функции Ъо/()

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

Дамп стека после переполнения Главное предназначение этой программы заключается в анализе уязвимостей переполнения буфера, поэтому на рис. 8.19 показан дамп стека после выполнения функции уіяескі(). Для примера был создан файл «Ьасі/ііе» с двадцатью символами «Л». После выполнения функции fread() область стека изменена так же, как и в предыдущей программе, но дополнительно появилась возможность управлять записью данных в буфер с помощью файла «Ъadfile». Запомним, что в функции определена дополнительная переменная стека - указатель дескриптора файла (дескриптор файла -уникальный идентификатор, присваиваемый системой \Уіпсіо\у8 файлу в момент его открытия или создания и существующий до момента его закрытия), которая размещена в старших адресах памяти стека сразу за областью буфера.

Дамп стека после выполнения функции fread()

Рис. 8.19. Дамп стека после выполнения функции fread()

Программа переполнения буфера После ознакомления с примером программы, уязвимой к переполнению буфера при чтении файла «badfile», пришло время познакомиться с программой, извлекающей из этого пользу, - программой переполнения буфера. Программа переполнения буфера написана на ANSI С, поэтому она может быть откомпилирована любым компилятором ANSI С. Для приведенных в книге примеров использованы компиляторы Visual C++ for Windows NT и

Основы переполнения буфера | Защита от хакеров корпоративных сетей | Gcc for linux


Защита от хакеров корпоративных сетей



Новости за месяц

  • Июнь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс