Файл: Исследование адресного пространства.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.11.2023

Просмотров: 61

Скачиваний: 9

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Рисунок 5.1. – Код программы c переполнением буфера.

В этой функции открывается файл с именем «badfile», далее делается попытка считать из него 1024 байта – в 8-байтовый буфер, затем файл закрывается. При выходе из функции должно произойти переполнение буфера. Таким образом, содержимое файла даст возможность контролировать адрес возврата в стековом кадре функции «bof».

Загрузка программы в отладчик и установка нужных параметров рабочего каталога представлены на рисунке 5.2.



Рисунок 5.2. – Загрузка программы в отладчик и установка параметров рабочего каталога.

Для сравнения можно изменять количество букв в файле и сравнить результат выполнения программы. Загрузка программы в отладчик с новыми входными данными представлена на рисунке 5.3.



Рисунок 5.3. – Загрузка программы в отладчик с новыми данными.

В прошлом примере был запуск программы с 16 символами, сейчас в файле «badfile» была строка из 6 символов. На рисунке видно что значение буфера правильно определено, поскольку размер строки не выходит из входного диапазона. Это подтверждает вывод программы, представленный на рисунке 5.4. Программа не завершилась и дошла до строки «printf(“Not gonna do it!”);», что означает правильность ее работы.



Рисунок 5.4. – Вывод программы.

  1. Использование уязвимостей: куча.

Адресное пространство для кучи выделяется, как правило, в том же сегменте, что и для стека, и заполняется в направлении стека от старших адресов к младшим. Память в куче выделяется с помощью функций типа «malloc», существующих во всех языках структурного программирования — «HeapAlloc» в Windows, «malloc» в стандарте ANSI для языка С или «new» в C++. Соответствующие функции «HeapFree», «free» и «delete» существуют и для освобождения памяти. Всю работу по распределении памяти выполняет диспетчер кучи. Именно он отвечает за выделение памяти для процессов и управляет ростом кучи. Таким образом, если процессу требуется больше динамической памяти, он ее получает.

    1. Простое переполнение.


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



Рисунок 6.1. – Текст программы.

Когда в буфер «input» помещается больше данных, чем изначально было выделено пространства, если контроль над размером заносимых в буфер данных не производится, то сбой в программе может не произойти. Пример компиляции и выполнения программы представлен на рисунке 6.2.



Рисунок 6.2 – Компиляция и выполнение программы.

На рисунке 6.3 представлено выполнение программы в отладчике с разными аргументами.



Рисунок 6.3. – Выполнение программы в отладчике с разными аргументами.

На рисунке 6.4 представлен результат выполнения программы.



Рисунок 6.4. – Результат выполнения программы.

    1. Переполнение в сегменте bcc.

Подобное переполнение может быть выполнено и для статических переменных, размещенных в сегменте bcc. На рисунке 6.5 представлен текст программы.


Рисунок 6.5. – Текст программы.

Результат компиляции и выполнения программы представлен на рисунке 6.6.


Рисунок 6.6. – Компиляция и выполнение программы.
Использование консольного отладчика представлено на рисунках 6.7 и 6.8.



Рисунок 6.7. – Использование консольного отладчика.


Рисунок 6.8 – Использование консольного отладчика.
С помощью команды «gdb bbc1» мы выбираем исполняемый файл для анализа. На экран терминала выводится версия

gdb, а также ссылки на сторонние ресурсы. Затем мы используем команду «gdb list», которая выводит на экран терминала весь исходный код программы. Командой «gdb break 10», мы смогли установить точку останова на десятой строчке программы.

С помощью команды «run Deskat-AB124-5», мы запустили программу, указав ей входные данные в виде фамилии, группы и номера студента по списку. В результате нас оповестили, что программа запустилась (Starting program), и было выведено, что программа достигла точки останова (10 строка). Команда «gdb info frame» позволяет отобразить информацию подробную информацию о кадре стека. Команда «gdb info proc mappings» сообщает нам о диапазонах адресного пространства памяти в процессе, размерах и адресах расположения объектных файлов. Команда «gdb all-registers» позволяет получить информацию обо всех регистрах и их значениях. Команда «gdb n» позволяет выполнить шаг с прыжком через вызываемую подпрограмму. В конце выполнения программы, мы получили сообщение, что процесс завершился нормально, значит программа отработала без ошибок.

Запуск программы, используя разные аргументы с помощью KDbg представлено на рисунке 6.9.


Рисунок 6.9. – Запуск программы с помощью KDbg.
Результат работы программы представлен на рисунке 6.10.


Рисунок 6.10. – Результат работы программы.
При простом переполнении кучи в буфер помещается больше данных, чем изначально было выделено пространства. Такое может произойти, если контроль над размером заносимых в буфер данных не производится. Следовательно, сбой в работе программы не произойдет.

Если же говорить про переполнение в сегменте bcc, то здесь подобной ситуации быть не может. При переполнении данных, выведется соответствующее сообщение, и, программа принудительно завершится.
Вывод: в результате выполнения работы было выявлено наличие уязвимостей в системе Debian Linux, связанных с переполнением буфера и использованием уязвимостей стека и кучи. Были проведены тесты на программном обеспечении, которые показали возможность реализации атак на систему. Были получены навыки оценки уровня безопасности операционной системы, выявления уязвимостей и разработки мер по их устранению.