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

Шрифт
Интервал


[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