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

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

Что перезаписывать?

Имея возможность использовать любые значения почти в любом месте памяти, перед злоумышленником встает вопрос: «Что перезаписывать?» Обладая возможностью использовать практически любой адрес памяти, у злоумышленника большой выбор. Он может изменить адрес точки возврата функции аналогично тому, как это делается при переполнении буфера. С помощью перезаписи адресов возврата может быть выполнен управляющий программный код злоумышленника. Но в отличие от переполнения буфера злоумышленник не ограничивает себя только подменой адресов возврата.

Перезапись адресов возврата

Большинство атак переполнения буфера сводятся к перезаписи адреса возврата какой-либо функции на адрес управляющего кода злоумышленника. Модифицированная подобным образом функция в конце своей работы передает управление не в точку возврата, а по подмененному злоумышленником адресу. При переполнении буфера перезаписывается адрес возврата из-за того, что фактически больше нечего перезаписывать. При атаках переполнения буфера злоумышленник не указывает точного адреса перезаписываемой области памяти. Запись ведется в области памяти, находящейся рядом с атакуемым буфером. В отличие от атак переполнения буфера при использовании уязвимости форматирующей строки данные злоумышленника записываются в указанную им область. Адрес области задается переменной, соответствующей спецификации преобразования %n. При завершении функции управление будет передано по адресу, записанному злоумышленником в результате многократной записи с использованием нескольких спецификаций преобразования %n.

При перезаписи адресов возврата злоумышленник может столкнуться с двумя проблемами. Одна из них состоит в том, что функция, у которой делается попытка подменить адрес возврата, в конце своей работы не возвращает управление вызвавшей ее функции. При использовании уязвимости форматирующей строки это обычное явление, потому что в большинстве случаев атакуемая функция выдает диагностическое сообщение и после выдачи диагностики инициирует аварийное завершение программы. Другими словами, выводится сообщение об ошибке, возможно, с использованием передаваемых программе данных, которые используются как параметры форматирующей строки, а затем вызывается функция завершения программы exit. В этом случае перезапись адреса возврата для любой функции, кроме printf, ничего не даст. Второй проблемой является то, что перезапись адресов возврата может пресекаться специальными средствами, например StarckGard.

Перезапись указателей таблицы глобальных смещений и указателей на функции

Таблица глобальных смещений (GOT – Global Оffset Table) – это секция в скомпонованной в формате ELF (executable and linkable format – формат исполняемых и компонуемых модулей) программе, в которой хранятся указатели на используемые программой библиотечные функции. Если заменить содержащийся в таблице GOT указатель так, чтобы вместо библиотечной функции он указывал на программный код злоумышленника, то при обращении к библиотечной функции с подмененным указателем будет вызван код злоумышленника.

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

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