Коллектив авторов

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


Скачать книгу

Alephl, написал на эту тему статью «Smashing the Stack for Fun and Profit» («Разрушение стека для забавы и обогащения»). Со статьей можно ознакомиться в 49-ом выпуске Phrack, статья номер 14.

      Посмотрите на следующую программу:

      /* scpybufo.c */

      /* Hal Flynn <[email protected]> */

      /* December 31, 2001 */

      /* scpybufo.c demonstrates the problem */

      /* with the strcpy() function which */

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

      /* program demonstrates strcpy not */

      /* sufficiently checking input. When */

      /* executed with an 8 byte argument, a */

      /* buffer overflow occurs. */

      #include <stdio.h>

      #include <strings.h>

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

      {

      overflow_function(*++argv);

      return (0);

      }

      void overflow_function(char *b)

      {

      char c[8];

      strcpy(c, b);

      return;

      }

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

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

      /* sprbufo.c */

      /* Hal Flynn <[email protected]> */

      /* 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 <stdio.h>

      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 <[email protected]> */

      /* 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 <stdio.h>

      #include <strings.h>

      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] передаются