Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
(МТУСИ)
Кафедра: «Информационной безопасности»
Отчёт по лабораторной работе №1
Дисциплина: «Защита информации в глобальных сетях»
по теме:
«Уязвимость переполнения буфера»
Выполнили: студент группы МБСТ0000
_________________________
Проверил:
Старший преподаватель кафедры «Информационная безопасность»
Барков Вячеслав Валерьевич
_________________________
Москва, 2025
Содержание
Y
1) Цель работы 3
2) Выполнение лабораторной работы 3
2.1) ПО с уязвимостью переполнения буфера 3
2.2) ПО с закрытой уязвимостью переполнения буфера 7
3) Заключение 10
Цель работы
Выполнить индивидуальное задание по теме «уязвимость переполнения буфера». Написать программный код с уязвимостью переполнения буфера, показать, что уязвимость есть и показать способ исправления кода.
Выполнение лабораторной работы
2.1) ПО с уязвимостью переполнения буфера
Установим компилятор языка СИ gcc, отладчик gdb представлен на рисунке 1
Рисунок 1 – Версия gcc и gdb
Исходный код программы представлен в листинге 1.
Листинг 1 – Программный код с уязвимостью переполнения буфера
#include <stdio.h>
void read_string()
{
char buffer[16];
printf("String: ");
scanf("%s", buffer);
}
int main()
{
read_string();
return 0;
}
Скомпилируем исходный файл с опциями –fno-stack-protector –z execstack –m32 –g main.c –o main и запустим его через компилятора gcc представлен на рисунке 2.
Рисунок 2 - Компиляция и запуск программы без переполнения буфера
Произведем переполнения буфера, введя строку больше буфера представлено на рисунке 3.
Рисунок 3 - Компиляция и запуск программы переполнив буфер
Дизассемблируем функцию read_string (рисунок 4)
Рисунок 4 - Дизассемблируем функцию read_string
Дизассемблируем функцию main (рисунок 5)
Рисунок 5 - Дизассемблируем функцию main
Сделаем файл, в котором будет прописана строка, которая переполняет буфер и на конце строки будет записан “DCBA”
Рисунок 6 – Файл для переполнения буфера с строкой DCBA
После запуска программы байтами DCBA перезаписан адрес возврата, вместо адреса возврата появятся следующие значения 44 43 42 41. Это коды букв D C B A. Возникла ошибка segmentation fault, переход будет некорректный и возникает ошибка, представленная на рисунке 7.
Рисунок 7 – Файл для переполнения буфера с строкой DCBA
2.2) ПО с закрытой уязвимостью переполнения буфера
На листинге 2 представлен программный код, которая убирает уязвимость переполнения буфера.
Листинг 2 - Программный код с закрытой уязвимостью переполнения буфера
#include <stdio.h>
void read_string()
{
int sizeBuffer = 16
char buffer[sizeBuffer];
printf("String: ");
fgets(buffer, sizeBuffer, stdin)
printf("%s", buffer);
}
int main()
{
read_string();
return 0;
}
Скомпилируем программу и запустим её. Введем строку, которая меньше размера буфера и вывод строки правильный представлен на рисунке 8.
Рисунке 8 - Скомпилированная программа без переполнения буфера
Введём в программу строку, которая будет переполнять буфер и посмотрим на вывод программы, который представлен на рисунке 9.
Рисунке 9 - Скомпилированная программа с переполнения буфера
Как видно из вывода программы, мы обрезали лишние элементы и вывели только первые 16 символов.
Попробуем записать строку, которую мы использовали для переполнения буфера. Данная операция представлена на рисунке 10.
Рисунок 10 – Файл для переполнения буфера с строкой DCBA
На рисунке 11, мы видим, что программный код с закрытой уязвимостью не дает нам возможность перезаписать код возврата.
Рисунок 11 – Выполнения кода с закрытой уязвимостью, и на вход подается строка, которая вызывает переполнения буфера
Заключение
В ходе выполнения лабораторной работы цель была достигнута. Был написан код, в котором есть уязвимость переполнения буфера, показано, что можно получить доступ к ячейке памяти, и так же сформирован код, закрывающий данную уязвимость.