Атака переполнения буфера с примером

Опубликовано: 4 Декабря, 2021

Буфер - это временная область для хранения данных. Когда программа или системный процесс помещает больше данных (чем было изначально выделено для хранения), эти дополнительные данные переполняются. Это приводит к тому, что некоторые из этих данных просачиваются в другие буферы, что может повредить или перезаписать любые данные, которые они хранят.

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

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

Разберем несколько реальных примеров программ, показывающих опасность подобных ситуаций на основе C.
В примерах мы не внедряем вредоносный код, а просто чтобы показать, что буфер может быть переполнен. Современные компиляторы обычно предоставляют возможность проверки переполнения во время компиляции / компоновки, но во время выполнения довольно сложно проверить эту проблему без какого-либо дополнительного механизма защиты, такого как использование обработки исключений.

// AC program to demonstrate buffer overflow
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main( int argc, char *argv[])
{
// Reserve 5 byte of buffer plus the terminating NULL.
// should allocate 8 bytes = 2 double words,
// To overflow, need more than 8 bytes...
char buffer[5]; // If more than 8 characters input
// by user, there will be access
// violation, segmentation fault
// a prompt how to execute the program...
if (argc < 2)
{
printf ( "strcpy() NOT executed.... " );
printf ( "Syntax: %s <characters> " , argv[0]);
exit (0);
}
// copy the user input to mybuffer, without any
// bound checking a secure version is srtcpy_s()
strcpy (buffer, argv[1]);
printf ( "buffer content= %s " , buffer);
// you may want to try strcpy_s()
printf ( "strcpy() executed... " );
return 0;
}

Скомпилируйте эту программу в Linux и для вывода используйте команду outpute_file INPUT

 Input  : 12345678 (8 bytes), the program run smoothly.
 Input : 123456789 (9 bytes)
"Segmentation fault" message will be displayed and the program terminates.

Уязвимость существует из-за того, что буфер может быть переполнен, если пользовательский ввод (argv [1]) превышает 8 байтов. Почему 8 байт? Для 32-битной (4 байта) системы мы должны заполнить память с двойным словом (32 бита). Размер символа (char) составляет 1 байт, поэтому, если мы запрашиваем буфер с 5 байтами, система выделяет 2 двойных слова (8 байтов). Вот почему при вводе более 8 байт; мой буфер будет переполнен

Подобные стандартные функции, которые технически менее уязвимы, такие как strncpy (), strncat () и memcpy (), действительно существуют. Но проблема с этими функциями заключается в том, что ответственность за определение размера буфера лежит на программисте, а не на компиляторе.

Каждый программист или программист на C / C ++ должен знать проблему переполнения буфера, прежде чем приступить к кодированию. Генерируется множество ошибок, которые в большинстве случаев могут быть использованы в результате переполнения буфера.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА
Википедия
Переполнение буфера
c ++ BufferOverflow

Эта статья предоставлена Акашем Шараном . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .