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

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

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

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

Добавлен: 09.11.2023

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

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

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования «Новосибирский государственный технический университет»Кафедра защиты информацииРасчетно-графическое задание«Освоение принципов разработки программных средств безопасности операционных систем и приложений»Факультет: АВТГруппа: АБ-124Студент: Дескат М. В.Преподаватель: Зырянов С. А.Вариант: 5Новосибирск 2023Цель работы: изучить процесс выполнения кода программы на языке С в операционной системе DebianLinux и способы выявления уязвимостей.Задание:

  1. Настройка системы, установка и тестирование программного обеспечения.

  2. Переменные окружения.

  3. Исследование адресного пространства Linux/Unix.

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

  5. Программа с переполнением буфера.

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

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

    2. Переполнение в сегменте bcc.
Ход работы:

  1. Настройка системы, установка и тестирование программного обеспечения.
Установка имени компьютеру в формате Группа-Номер студента по списку 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.

  1. Переменные окружения.
Написание текста программы представлено на рисунке 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» было изменено.

  1. Исследование адресного пространства Linux/Unix.
Программа распечатывает местонахождение двух функций «main()» и «afunc()». Затем она показывает, как стек растет вниз, позволяя «afunc()» распечатать адреса последовательных экземпляров ее локальной переменной «stack_var». Затем она показывает расположение памяти, выделенной с помощью «alloca()». В заключение она печатает местоположение переменных данных и BBS, а затем памяти, выделенной через «sbrk()». Текст программы представлен на рисунке 3.1.Рисунок 3.1. – Текст программы.Результат запуска программы на системе IntelGNU/Linux представлен на рисунке 3.2. В пункте «TextLocation» отображаются две строки «Addressofmain» и «Addressofafunc», их значения обозначают местонахождение этих функций в памяти. В пункте «StackLocation» распечатываются адреса последовательных экземпляров локальной переменной 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. – Выполнение строки кода программы.

  1. Использование уязвимостей: стек.
Код программы с неконтролируемым переполнением представлен на рисунке 4.1. В программе вызывается пользовательская функция bof. В этой функции строка из 20 букв «A» копируется в буфер, рассчитанный на хранение 8 байт, что приводит к его переполнению.Рисунок 4.1. – Код программы с неконтролируемым переполнением.Выполнение программы в отладчике представлено на рисунке 4.2.Рисунок 4.2. – Выполнение программы в отладчике.

  1. Программа с переполнением буфера.
Программа считывает входные данные из файла в небольшой буфер, размещенный в стеке. Если объем данных превысит размер буфера, произойдет переполнение стека. Поскольку содержимое файла можно изменять, это предоставляет нам возможность изучить, каким образом переполнение стека можно использовать.Код программы с переполнением буфера представлен на рисунке 5.1.