Lab3_otchet
.docxФедеральное агентство связи
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное
учреждение высшего образования
Московский технический университет связи и информатики»
Кафедра «Информационной безопасности»
Отчёт по лабораторной работе №3 по дисциплине «Защита информации в глобальных сетях»
Выполнил студент группы
Москва, 2020
Порядок выполнения:
Выполнить настройку окружения:
Установить виртуальную машину
Установить операционную систему
Установить компилятор языка C
Установить отладчик
Установить Meatasploit Framework
Скомпилировать исходный файл с опциями -fno-pie -fno-stack-protector -z execstack -m32 -g
Запустить под отладчиком
Дизассемблировать функцию read_password и определить, сколько байт занимают локальные переменные в стеке
Перезапустить программу и ввести такую строку, которая приведёт к модификации всех байтов адреса возврата
Дизассемблировать функцию main и найти адрес инструкции, которая следует за инструкцией “mov eax,0”
Подготовить файл с входными данными, в котором в качестве адреса возврата будет указан адрес инструкции из пункта 6
Запустить программу, перенаправив ввод из файла, созданного в пункте 7
Запустить утилиту msfvenom для генерации shell кода: msfvenom –format c –platform linux -p linux/x86/exec -e x86/call4_dword_xor –bad-chars ‘\x0a\x0b\x0c\x0d’ -a x86 AppendExit=true CMD=’bash’
Подготовить файл, в котором будет строка, содержащая те же данные, что и в пункте 5, и дополнительно байты shell кода из пункта 9.
Запустить программу под отладчиком, установить точку останова на последней инструкции функции read_password
После остановки программы просмотреть 100 байтов памяти, начиная с адреса, хранящемся в регистре ESP
Вычислить адрес начала исполняемого кода
Отредактировать файл, указав правильный адрес
Перезапустить приложение
Ход работы:
Установим компилятор языка с gcc, отладчик gdb и Metasploit framework (рисунок 1)
Рисунок 1 – Версии gcc и gdb
Исходный код программы на языке C представлен ниже:
#include <stdio.h>
#define SIZE 12
void read_password() {
char buffer[SIZE];
printf(“password”);
scanf(“%s”, buffer);
}
int main() {
read_password();
return 0;
}
Скомпилируем исходный файл с опциями -fno-pie -fno-stack-protector -z execstack -m32 -g и запустим его под отладчиком (рисунок 2)
Рисунок 2 – Компиляция и запуск программы
Дизассемблируем функцию read_password (рисунок 3).
Рисунок 3 – Дизассемблирование функции read_password
Если посмотреть на строку со смещением +7, то видно, что на локальные переменные было выделено 24 байта (0х18 в 16-ричной системе). Соответственно, если ввести больше 24 символов, то они затрут адрес возврата, который был положен на стек, и код исполнится с ошибкой (рисунок 4)
Рисунок 4 – Запуск кода с ошибкой
Дизассемблируем функцию main (рисунок 5)
Рисунок 5 – Дизассемблирование функции main
Адрес команды, идущей после команды по смещению +15 – 0x00001232
Создадим файл, с помощью которого можно перезаписать изначальный адрес возврата на другой и попытаемся запустить (рисунок 6)
Рисунок 6 – Создание и запуск файла
Запустим утилиту msfvenom для генерации shell кода, который будет вызывать bash (рисунок 7)
Рисунок 7 – Результат работы утилиты msfvenom
Создадим строку с байтами shell кода (рисунок 8).
Рисунок 8 – Строка с байтами shell кода
Запустим программу под отладчиком, подадим на вход сформированный файл с байтами shell кода и поставим точку останова на инструкции ret функции read_password (рисунок 9)
Рисунок 9 – Запуск программы с точкой останова
Посмотрим 100 байтов памяти, начиная с адреса, хранящегося в регистре ESP (рисунок 10)
Рисунок 10 – 100 байтов памяти в момент остановки
Первые 4 байта – буквы ABCD. Необходимо найти следующий после них адрес. Т.к. исходный адрес 0хffffd08c, то прибавив 4 в 16-рисной системе получим 0xffffd090. Отредактируем файл и укажем в нем данный адрес (рисунок 11)
Рисунок 11 – Отредактированный файл
Перезапустим приложение (рисунок 12)
Рисунок 12 – Приложение, выполняющее shell код
Вывод: В данной лабораторной работе была рассмотрена и применена уязвимость переполнения буфера.