Защита от хакеров корпоративных сетей - страница 66



[1], в котором хранится аргумент вызова программы, копируются функцией strcpy в массив символов, для которого при объявлении была выделена память для восьми символов. Поскольку в программе не выполняется никаких проверок размера пересылаемых данных, то при копировании более восьми символов происходит переполнение буфера.

Функция sprintf — еще один пример часто встречающейся подверженной ошибкам функции. В результате ее применения возможно переполнение буфера, как это показано в следующем примере:


>/* sprbufo.c */

>/* Hal Flynn */

>/* December 31, 2001 */

>/* sprbufo.c demonstrates the problem */

>/* with the sprintf() function which */

>/* is part of the c library. This */

>/* program demonstrates sprintf not */

>/* sufficiently checking input. When */

>/* executed with an argument of 8 bytes */

>/* or more a buffer overflow occurs. */

>#include

>int main(int argc, char *argv[])

>{

>overflow_function(*++argv);

>return (0);

>}

>void overflow_function(char *b)

>{

>char c[8];

>sprintf(c, “%s”, b);

>return;

>}


Как и в предыдущем примере, строка символов аргумента программы копируется в восьмибайтовый массив символов. Поскольку при копировании из argv [1] не выполняется никаких проверок на соответствие размера пересылаемых данных размеру памяти, в которую выполняется копирование, то в результате возможно переполнение буфера.

Применение функции strcat без проверки размера обрабатываемых данных также может привести к переполнению буфера, как это видно из следующего примера:


>/* scatbufo.c */

>/* Hal Flynn */

>/* December 31, 2001 */

>/* scatbufo.c demonstrates the problem */

>/* with the strcat() function which */

>/* is part of the c library. This */

>/* program demonstrates strcat not */

>/* sufficiently checking input. When */

>/* executed with a 7 byte argument, a */

>/* buffer overflow occurs. */

>#include

>#include

>int main(int argc, char *argv[])

>{

>overflow_function(*++argv);

>return (0);

>}

>void overflow_function(char *b)

>{

>char c[8] = «0»;

>strcat(c, b);

>return;

>}


Данные командной строки из массива argv [1] передаются функции overflow_function, которая сцепляет их с данными восьмибайтового массива символов с. Поскольку в программе размер сцепляемых данных не проверяется, то в результате возможен выход за границы массива c.

Gets – еще одна проблематичная функция языка C. Компилятор GNU языка C выдает предупреждающее сообщение при компиляции программ с функцией gets, потому что эта функция никак не контролирует размер получаемых данных. Посмотрите на следующий пример:


>/* getsbufo.c */

>/* Hal Flynn */

>/* December 31, 2001 */

>/* This program demonstrates how NOT */

>/* to use the gets() function. gets() */

>/* does not sufficient check input */

>/* length, and can result in serious */

>/* problems such as buffer overflows. */

>#include

>int main()

>{

>get_input();

>return (0);

>}

>void get_input(void)

>{

>char c[8];

>printf(“Enter a string greater than seven bytes: ”);

>gets(c);

>return;

>}


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

Подробнее с проблемой переполнения буфера можно познакомиться в главе 8.

Ошибки проверки входных данных