ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 60
Скачиваний: 9
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования «Новосибирский государственный технический университет»
Кафедра защиты информации
Расчетно-графическое задание
«Освоение принципов разработки программных средств безопасности операционных систем и приложений»
Факультет: АВТ
Группа: АБ-124
Студент: Дескат М. В.
Преподаватель: Зырянов С. А.
Вариант: 5
Новосибирск 2023
Цель работы: изучить процесс выполнения кода программы на языке С в операционной системе Debian Linux и способы выявления уязвимостей.
Задание:
-
Настройка системы, установка и тестирование программного обеспечения. -
Переменные окружения. -
Исследование адресного пространства Linux/Unix. -
Использование уязвимостей: стек. -
Программа с переполнением буфера. -
Использование уязвимостей: куча.-
Простое переполнение кучи. -
Переполнение в сегменте bcc.
-
Ход работы:
-
Настройка системы, установка и тестирование программного обеспечения.
Установка имени компьютеру в формате Группа-Номер студента по списку DiSpace соответствующие исполнителю представлена на рисунке 1.1.
Рисунок 1.1. – Установка имени компьютеру.
Добавление пользователя и добавление его в группу sudo представлено на рисунке 1.2.
Рисунок 1.2. – Добавление пользователя и добавление его в группу sudo.
Вид окна терминала и строки приглашения после перезапуска системы представлен на рисунке 1.3.
Рисунок 1.3. – Вид окна терминала и строки приглашения.
Определение списка источников для менеджера пакетов APT представлена на рисунке 1.4.
Рисунок 1.4. – Определение списка источников для менеджера пакетов APT.
Проверка и установка обновлений update, upgrade представлены на рисунке 1.5.
Рисунок 1.5. – Проверка и установка обновлений.
Проверка установки компилятора GCC представлена на рисунке 1.6.
Рисунок 1.6. – Проверка установки компилятора GCC.
Установка отладчика представлена на рисунке 1.7.
Рисунок 1.7 – Установка отладчика.
Установка графического интерфейса отладчика KDbg представлена на рисунке 1.8.
Рисунок 1.8. – Установка графического интерфейса отладчика KDbg.
-
Переменные окружения.
Написание текста программы представлено на рисунке 2.1.
Рисунок 2.1. – Текст программы.
Выполнение компиляции представлено на рисунке 2.2.
Рисунок 2.2. – Выполнение компиляции.
Пояснения значениям параметров и флагов. Флаг «-g» генерирует отладочную информацию, которая будет использоваться отладчиком GDB.
Параметр «-Wall» сообщает компилятору GCC о необходимости вывода подавляющего большинства предупреждений, некоторые предупреждения не выводятся даже при использовании данного параметра. Для их вывода используется параметр «-
Wextra». Флаг «-o» предоставляет возможность записи выходных данных сборки в выходной файл.
Результат выполнения программы представлен на рисунке 2.3. Параметр «PWD» отображает текущую директорию в терминале. Параметр «USERNAME» отображает текущее имя пользователя. Параметр «HOME» отображает домашнюю директорию. Параметр «LOGNAME» указывает на имя пользователя, запустившего компиляцию, пользователя.
Рисунок 2.3. – Результат выполнения программы.
Перенаправление результата выполнения программы в файл представлено на рисунке 2.4.
Рисунок 2.4 – Перенаправление результата выполнения программы в файл.
Просмотр последовательности выполнения кода программы с использованием консольного отладчика представлен на рисунке 2.5.
Рисунок 2.5 – Просмотр последовательности выполнения кода программы с помощью консольного отладчика.
Результат выполнения дизассемблирования представлен на рисунке 2.6.
Рисунок 2.6. – Результат выполнения дизассемблирования.
Выполнение программы с использованием приложения KDbg представлено на рисунках 2.7 (1 шаг), 2.8 (2 шаг).
Рисунок 2.7. – Выполнение программы с помощью KDbg (1 шаг).
На первом шаге можно увидеть, что значение переменной «i» равняется нулю, а значение переменной «args» равняется одному. Также нам известен номер ID текущего потока выполнения программы (process 6) и его расположение. В рамке «регистры» отображается название регистров и их значения. По середине можно узнать адрес в памяти конкретной переменной.
Рисунок 2.8. – Выполнение программы с помощью KGdb (шаг два).
На втором шаге можно увидеть, что значение переменных, номер
ID текущего потока и адрес памяти переменных остался тем же. Но значение регистров «rax» и «rdx» было изменено.
-
Исследование адресного пространства Linux/Unix.
Программа распечатывает местонахождение двух функций «main()» и «afunc()». Затем она показывает, как стек растет вниз, позволяя «afunc()» распечатать адреса последовательных экземпляров ее локальной переменной «stack_var». Затем она показывает расположение памяти, выделенной с помощью «alloca()». В заключение она печатает местоположение переменных данных и BBS, а затем памяти, выделенной через «sbrk()».
Текст программы представлен на рисунке 3.1.
Рисунок 3.1. – Текст программы.
Результат запуска программы на системе Intel GNU/Linux представлен на рисунке 3.2. В пункте «Text Location» отображаются две строки «Address of main» и «Address of afunc», их значения обозначают местонахождение этих функций в памяти. В пункте «Stack Location» распечатываются адреса последовательных экземпляров локальной переменной stack_var. Затем отображается расположение памяти, выделенной с помощью «alloca». И в заключение, печатается местоположение переменных данных и BBS, а затем памяти, выделенной через sbrk().
Рисунок 3.2. – Результат запуска программы.
Затем мы загружаем исходный код программы и исполняемый файл в отладчик KDbg. Устанавливаем точки остановки исполнения, как представлено на рисунке 3.3.
Рисунок 3.3. – Загрузка исходного кода программы в KDbg.
Вывод результата запуска программы представлен на рисунке 3.4.
Рисунок 3.4 – Вывод результата запуска программы.
Полученные результаты при запуске программы в терминале и в приложении
KDbg отличаются. Местонахождение функций «main» и «afunc» имеет другой адрес памяти. Также отличаются адреса последовательных экземпляров локальной переменной «stack_var», расположение памяти выделенной с помощью «alloca», местоположение переменных данных BBC и память, выделенная через «sbrk». Значения регистров и флагов в разных методах запуска, содержат разные значения.
Существует регистр-указатель команд EIP/IP, имеющий разрядность 32/16 бит и содержащий смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. На рисунке 3.5 представлено выполнение строки кода «p = (char *) alloca(32)», где функция «alloca» выделяет 32 байт памяти в стеке.
Рисунок 3.5. – Выполнение строки кода программы.
-
Использование уязвимостей: стек.
Код программы с неконтролируемым переполнением представлен на рисунке 4.1. В программе вызывается пользовательская функция bof. В этой функции строка из 20 букв «A» копируется в буфер, рассчитанный на хранение 8 байт, что приводит к его переполнению.
Рисунок 4.1. – Код программы с неконтролируемым переполнением.
Выполнение программы в отладчике представлено на рисунке 4.2.
Рисунок 4.2. – Выполнение программы в отладчике.
-
Программа с переполнением буфера.
Программа считывает входные данные из файла в небольшой буфер, размещенный в стеке. Если объем данных превысит размер буфера, произойдет переполнение стека. Поскольку содержимое файла можно изменять, это предоставляет нам возможность изучить, каким образом переполнение стека можно использовать.
Код программы с переполнением буфера представлен на рисунке 5.1.