Переполнение указателя на символ - PullRequest
0 голосов
/ 05 августа 2010

Я новичок в C, и мне было интересно, возможно ли переполнение указателя уязвимой функцией c, такой как strcpy (). Я видел это много в исходном коде, это способ избежать переполнения буфера?

Ответы [ 3 ]

1 голос
/ 05 августа 2010

Конечно, если вы не выделите достаточно места для буфера, вы наверняка сможете:

char* ptr = (char*)malloc(3);
strcpy(ptr, "this is very, very bad"); /* ptr only has 3 bytes allocated! */

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

Вот почему с C вы должны быть предельно осторожны с такими вещами и проверять код дважды, трижды, n-й степени. После этого проверьте еще раз.

1 голос
/ 05 августа 2010

Да, это так.Это на самом деле классическая причина уязвимости переполнения буфера.Единственный способ избежать переполнения буфера - убедиться, что вы не делаете ничего, что может вызвать переполнение.В случае strcpy решение состоит в том, чтобы использовать strncpy, который включает размер буфера, в который копируется строка.

0 голосов
/ 05 августа 2010

Некоторые другие подходы

#define MAX_LENGTH_NAME 256

foo()
{
char a[MAX_LENGTH_NAME+1]; // You can also use malloc here

strncpy(a,"Foxy",MAX_LENGTH_NAME);

snprintf(a,MAX_LENGTH_NAME,"%s","Foxy");

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...