Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
(МТУСИ)
Кафедра: «Информационной безопасности»
Отчёт по лабораторной работе №2
Дисциплина: «Защита информации в глобальных сетях»
по теме:
«Уязвимость форматной строки»
Выполнили: студент группы МБСТ0000
_________________________
Проверил:
Старший преподаватель кафедры «Информационная безопасность»
Барков Вячеслав Валерьевич
_________________________
Москва, 2025
Содержание
Y
1) Цель работы 3
2) Выполнение лабораторной работы 3
2.1) ПО с уязвимостью форматной строки 3
2.2) ПО с закрытой уязвимостью форматной строки 6
3) Заключение 9
Цель работы
Выполнить индивидуальное задание по теме «уязвимость форматной строки». Написать программный код с уязвимостью форматной строки, показать, что уязвимость есть и показать способ исправления кода.
Выполнение лабораторной работы
2.1) ПО с уязвимостью форматной строки
Установим компилятор языка gcc, отладчик gdb представлен на рисунке 1
Рисунок 1 – Версия gcc и gdb
Исходный код программы представлен в листинге 1.
Листинг 1 – Программный код с уязвимостью форматной строки
#include <stdio.h>
#include <string.h>
void print(char* buffer)
{
printf(buffer, 42, 100);
}
int main(int argc, char **argv)
{
char buffer[1024];
if (argc >= 2)
{
strncpy(buffer, argv[1], 1024);
print(buffer);
}
return 0;
}
Скомпилируем исходный файл с опциями –fno-stack-protector –z execstack –m32 –g main.c –o main и запустим его через компилятора gcc, представленный на рисунке 2.
Рисунок 2 - Компиляция и запуск программы без уязвимости форматной строки
Сделаем уязвимость форматной строки, прочитаем память на стеке при помощи ввода %08x и получим значения в ячейках памяти.
Рисунок 3 - Компиляция и запуск программы, при которой возникает уязвимость форматной строки
2.2) ПО с закрытой уязвимостью форматной строки
На листинге 2 представлен ниже программный код, которая убирает уязвимость форматной строки. Сделаем так, что printf через %s, и не мог использовать спецсимволы, воспринимал всё как строку.
Листинг 2 - Программный код с закрытой уязвимостью форматной строки
#include <stdio.h>
#include <string.h>
void print(char* buffer)
{
printf(«%s», buffer);
}
int main(int argc, char **argv)
{
char buffer[1024];
if (argc >= 2)
{
strncpy(buffer, argv[1], 1024);
print(buffer);
}
return 0;
}
Скомпилируем программу и запустим её. Введем строку, которая не выполняет уязвимость, показанную на рисунке 8.
Рисунке 8 - Скомпилированная программа без уязвимость форматной строки
Введём в программу строку, которая должна показать значения памяти. Но программный код выводит нашу строку, которая была введена и представленна на рисунке 9.
Рисунке 9 - Скомпилированная программа с уязвимостью форматной строки
Как видно из вывода программы, мы больше не можем получить доступ к значениям ячейкам памяти. Программа выводит только то, что мы введём в строчку.
Заключение
В ходе выполнения лабораторной работы цель была достигнута. Был написал код, в котором есть уязвимость форматной строки, показана, что можно получить доступ к ячейке памяти. Cделан код, закрывающий данную уязвимость.