arrow_backНазад к полевым заметкам
WEB SECURITY Опубликовано 9 Aug 2026

Что такое переполнение буфера? Практическое руководство

Узнайте, как работают переполнения буфера, на реальном примере на C, диаграмме стека и инструментах для самостоятельного анализа.

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

Уязвимый паттерн

Вот классический пример на C:

#include <string.h>

void greet(char *name) {
    char buffer[64];
    strcpy(buffer, name);
}

int main(int argc, char **argv) {
    greet(argv[1]);
    return 0;
}

strcpy копирует переданную ему строку в buffer без проверки границ. Если argv[1] длиннее 64 байт, копирование продолжается за концом массива. На стеке buffer находится ниже других локальных переменных, сохранённых регистров и, в конце концов, адреса возврата, который сообщает процессору, куда перейти после завершения greet(). Если перезаписать адрес возврата адресом, который вы контролируете, вы контролируете, что будет выполняться дальше.

Почему это всё ещё компилируется и работает

C и C++ не выполняют автоматическую проверку границ для сырых массивов. Функции типа strcpy, gets, sprintf и strcat с удовольствием записывают за концом буфера, потому что они заботятся только о нулевом терминаторе или длине источника, а не о реальном размере назначения. Сравните это с strncpy или snprintf, которые принимают явный аргумент размера и останавливаются там. Уязвимость не совсем

Написано с помощью ИИ, проверено и опубликовано Михалом Пильхом (CISSP), Korra Studio.

Готовы пойти дальше?

Это одна заметка из базы знаний Korra Studio — платформа сочетает каждую тему с наставничеством один на один.

Начать бесплатноarrow_forward