Защита от хакеров корпоративных сетей. Коллектив авторов
Чтение книги онлайн.

Читать онлайн книгу Защита от хакеров корпоративных сетей - Коллектив авторов страница 51

СКАЧАТЬ что исходный текст программы размещается в нескольких файлах, а не в одном. Например, исходный текст почтовых транспортных агентов, Web-серверов и им подобных программ может быть размещен в нескольких исходных файлах, файлах заголовков, сборочных файлах проекта и в нескольких директориях.

      Поиск функций, подверженных ошибкам

      Рассмотрим подробнее поиск функций, подверженных ошибкам. Подобный поиск может осуществляться различными способами. Один их них заключается в том, чтобы в редакторе открыть каждый файл исходного текста программы и в нем средствами поиска редактора искать подверженную ошибкам функцию. Скорее всего, на это уйдет много времени. Целесообразнее и эффективнее использовать утилиту grep.

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

Переполнение буфера

      Переполнение буфера, известное также как ошибка граничных условий, происходит в том случае, когда размер записываемых в память данных превышает размер выделенной для этого области памяти. Елиас Леви (Elias Levy), известный как 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 */

      /* СКАЧАТЬ