
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
код
Вывод: В данной лабораторной работе была рассмотрена и применена уязвимость переполнения буфера.