Москва
+7-929-527-81-33
Вологда
+7-921-234-45-78
Вопрос юристу онлайн Юридическая компания ЛЕГАС Вконтакте

Переполнение буфера.

Обновлено 10.01.2026 08:44

 

Переполнение буфера.

 

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

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

Код buffoverflow.c

void buffoverflow (char *str) {

char buffer[20];

strcpy(buffer, str); // Функция, копирующая значения переменных str в buffer

}

int main() {

char big_stnng[128];

int 1;

for(i=0; l < 128; i++) // Цикл повторяется 128 раз

{

big_string[i] = 'A'; // big_string заполняется символами 'A'

}

buffoverflow(big_stnng);

exit(0);

}

В предшествующем коде есть функция под именем buffoverflow(), которая принимает указатель на строку с именем str и копирует находящиеся по этому адресу памяти данные в локальную переменную buffer, которой выделено 20 байт памяти. Главная функция программы выделяет буфер размером 128 байт с именем big_string и с помощью цикла for заполняет буфер символами А. Затем она вызывает buffoverflow(), передав в качестве аргумента указатель на этот 128-байтовый буфер. Это не должно пройти гладко, потому что buffoverlow() попытается втиснуть 128 байт данных в буфер, которому выделено всего 20 байт памяти. Оставшиеся 108 байт данных просто покроют все, что находится в памяти за буфером. Очевидно, что в результате программа аварийно завершится из-за переполнения. Программист нередко встречается с такими ошибками, которые легко исправить, если только известно, какой длины будут входные данные. Часто программист рассчитывает, что вводимые пользователем данные всегда будут иметь определенную длину, и основывает на этом свои действия. Но тут напомним одну из основных мыслей моего блога - взлом в том и заключается, чтобы представить себе ситуацию, на которую не рассчитывали, и тогда программа, прекрасно работавшая годами, может внезапно рухнуть, если хакер решит ввести тысячу символов в поле, которое обычно принимает несколько десятков символов, например имя пользователя.

Итак, хитрый хакер может вызвать крах программы, введя неожиданные значения, которые вызовут переполнение буфера, но как при этом получить контроль над программой? Ответ можно найти, если разобраться, какие именно данные оказываются затертыми.

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

Телеграм-канал: https://t.me/zashchitainformacii

Группа в Телеграм: https://t.me/zashchitainformacii1

Сайт: https://legascom.ru

Электронная почта: online@legascom.ru

#защитаинформации #информационнаябезопасность

 

Buffer overflow.

 

C is a top-level programming language, but it assumes that data integrity is provided by the programmer himself. If you assign responsibility for data integrity to the compiler, the result will be executable files that will run much slower due to the integrity checks performed for each variable. In addition, the programmer will lose significant control over the program, and the language will become more complex.

At the same time, the simplicity of C gives the programmer more control and increases the efficiency of the resulting programs, but it can lead to programs prone to buffer overflows or memory leaks if the programmer is not attentive enough. This means that if memory is allocated to a variable, then no built-in protection mechanisms will ensure that the size of the data placed in the variable corresponds to the memory space allocated for it. If a programmer wants to write ten bytes of data to a buffer that has only eight bytes of memory allocated, nothing prevents him from doing so, even if the result is almost certainly a crash of the program. This action is called buffer overflow, because two extra bytes will overflow the buffer and will be placed beyond the end of the allocated memory, destroying what was further away. If an important piece of data is changed, it will cause the program to crash. The corresponding example is given by the following code.

The buffoverflow.c code

void buffoverflow (char *str) {

char buffer[20];

strcpy(buffer, str); // Function that copies the values of str variables to buffer

}

int main() {

char big_stnng[128];

int 1;

for(i=0; l < 128; i++) // The loop repeats 128 times

{

big_string[i] = 'A'; // big_string is filled with characters 'A'

}

buffoverflow(big_stnng);

exit(0);

}

In the previous code, there is a function called buffoverflow(), which takes a pointer to a string named str and copies the data located at this memory address to the local buffer variable, which is allocated 20 bytes of memory. The main function of the program allocates a 128-byte buffer named big_string and uses the for loop to fill the buffer with characters A. Then it calls buffoverflow(), passing a pointer to this 128-byte buffer as an argument. This should not go smoothly, because buffoverlow() will try to cram 128 bytes of data into a buffer that has only 20 bytes of memory allocated. The remaining 108 bytes of data will simply cover everything that is in memory behind the buffer. Obviously, as a result, the program will crash due to overflow. It is not uncommon for a programmer to encounter such errors, which are easy to fix if only one knows how long the input data will be. Often, a programmer expects that the data entered by the user will always have a certain length, and bases his actions on this. But here we recall one of the main thoughts of my blog - hacking is to imagine a situation that was not expected, and then a program that has been working fine for years may suddenly collapse if a hacker decides to enter a thousand characters into a field that usually takes several dozen characters, such as a username.

So, a cunning hacker can crash a program by entering unexpected values that will cause a buffer overflow, but how can he gain control of the program? The answer can be found if you figure out which data is being erased.

Oleg Petukhov, lawyer in the field of international law and personal data protection, information security specialist security, protection of information and personal data.

Telegram channel: https://t.me/protectioninformation

Telegram Group: https://t.me/informationprotection1

Website: https://legascom.ru

Email: online@legascom.ru

#informationprotection #informationsecurity