Защита от хакеров корпоративных сетей - страница 66
Функция 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.