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

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

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

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

Добавлен: 09.11.2023

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

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

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

Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования «Новосибирский государственный технический университет»


Кафедра защиты информации
Расчетно-графическое задание

«Освоение принципов разработки программных средств безопасности операционных систем и приложений»


Факультет: АВТ

Группа: АБ-124

Студент: Дескат М. В.

Преподаватель: Зырянов С. А.

Вариант: 5

Новосибирск 2023
Цель работы: изучить процесс выполнения кода программы на языке С в операционной системе Debian Linux и способы выявления уязвимостей.
Задание:

  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. – Текст программы.
Результат запуска программы на системе 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. – Выполнение строки кода программы.


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

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



Рисунок 4.1. – Код программы с неконтролируемым переполнением.

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


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


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

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

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