Читаем Защита от хакеров корпоративных сетей полностью

Подобные функции реализованы во многих библиотеках С для UNIX.

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

Было проведено много исследований в области создания программного кода полезной нагрузки, состоящего из алфавитно-цифровых символов и младших символов кода ASCII. При возможности реализации этим способом необходимых функциональных возможностей исследования увенчались успехом. В частности, был разработан способ кодирования полезной нагрузки по стандартам MIME (MIME – набор стандартов для передачи мультимедийной информации посредством электронной почты) или командой XOR, выполненной над последовательностью из нескольких байт. Применяемая кодировка позволяет маскировать странную последовательность байтов под программный код полезной нагрузки из ASCII-символов.

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

Частичное переполнение буфера и искажение данных

В последнее время значительно увеличилось число программистов, начавших использовать строковые функции с ограничениями, например функцию strncpy вместо strcpy. Этих программистов научили, что функции с ограничениями защищают от переполнения буфера. Как же они удивятся, когда узнают, что зачастую применяют их неправильно.

Широко известна общая ошибка использования функций с ограничениями, получившая название «минус один», когда максимальная длина записываемой в буфер строки приравнивается размеру буфера. При этом часто забывают об обязательном признаке конца строки – завершающем строку нулевом байте. Некоторые функции с ограничениями могут не включать в строку завершающего символа, позволяя строке незаметно слиться со строкой из рядом расположенного буфера. Если позднее обратиться к ней, то два буфера могут рассматриваться как один, способствуя переполнению буфера.

Рассмотрим пример:

[buf1 – 32 bytes \0][buf2 – 32 bytes \0]

После записи в буфер в bufl ровно 32 байтов два буфера выглядят следующим образом:

[buf1 – 32 bytes of data ][buf2 – 32 bytes \0]

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже