Дамп стека после переполнения
Главное предназначение этой программы заключается в анализе уязвимостей переполнения буфера, поэтому на рис. 8.19 показан дамп стека после выполнения функции
Рис. 8.19. Дамп стека после выполнения функции
Программа переполнения буфера
После ознакомления с примером программы, уязвимой к переполнению буфера при чтении файла
Вначале рассмотрен более простой случай – программа переполнения буфера для Linux, а затем для Windows NT и отмечены различия используемых способов переполнения буфера для других платформ.
Основные принципы построения программ переполнения буфераВ секции подробно описаны принципы построения работоспособной программы переполнения буфера для различных платформ. В предыдущем примере было показано, каким образом переполнение буфера используется для контроля содержимого регистра EIP. Теперь нужно разобраться, как этим можно воспользоваться вообще и для управления компьютером в частности.
Контролируя содержимое регистра EIP, можно выполнить нужный программный код. Обычно это достигается путем прямого или косвенного указания на специально написанный для этих целей программный код – программный код полезной добавки, или
В основе современных программ переполнения буфера лежат несколько идей, но будут рассмотрены только некоторые из них, применимые к большинству типов рассматриваемых программ.
Создание программ переполнения буфера подразумевает несколько этапов. Во-первых, нужно получить доступ к буферу данных, то есть найти способ размещения в нем данных. Во-вторых, для того чтобы выполнить нужный код, следует найти способ контроля содержимого регистра EIP. Таких способов несколько. И наконец, в-третьих, нужен программный код полезной нагрузки, выполняющий возложенные на него функции.
Структура программы переполнения буфераПервый этап разработки программы переполнения буфера заключается в поиске способа переполнения буфера. Обычно это несложная задача, решаемая автоматизированными сетевыми средствами записи в буфер или записью в файл нужных данных, которые позже прочитает программа, уязвимая к переполнению буфера. Но иногда не все так просто.
Загрузчики и программный код полезной нагрузки.
В военном деле широко используются два связанных понятия: средства доставки и полезный груз. Аналогичные понятия применимы и для переполнения буфера. Говоря о переполнении буфера, подразумевают наличие средства доставки – загрузчикаУсловия работоспособности программного кода полезной нагрузки.
Проще всего загрузчик и программный код полезной нагрузки разместить в одном стеке, но так обычно не делается. При использовании стека для хранения загрузчика и программного кода полезной нагрузки следует позаботиться об их взаимодействии и учесть ограничения на допустимый размер программного кода полезной нагрузки. Если программный код полезной нагрузки загружается в память раньше загрузчика, то следует убедиться, что они не конфликтуют друг с другом. Если программы перекрываются, то в программном коде полезной нагрузки следует предусмотреть команду перехода, которая позволяет обойти код загрузчика и продолжить выполнение программного кода полезной нагрузки. Если вопросы их взаимодействия трудноразрешимы, то рекомендуется размещать программный код полезной нагрузки отдельно от загрузчика.Все программы вводят данные пользователя и хранят их где-нибудь. Любой буфер в программе является кандидатом на хранение программного кода полезной нагрузки. Вопрос только в том, как заставить процессор выполнить его.
Чаще всего для размещения программного кода полезной нагрузки используются:
• файлы на диске, которые загружаются в память;
• доступные локальному пользователю переменные окружения;
• передаваемые через Web-запрос общие переменные окружения;
• доступные пользователю поля сетевого протокола.
После размещения программного кода полезной нагрузки в памяти компьютера остается правильно загрузить в регистр EIP-адрес кода. При размещении программного кода полезной нагрузки не в области стека появляется ряд преимуществ, и ранее невозможное становится возможным. Например, сразу исчезает ограничение на размер кода. До сих пор для установления контроля над компьютером используется ошибка занижения или завышения на единицу числа подсчитываемых объектов (off-by-one error).
Способы передачи управления программному коду полезной нагрузкиВ последующих секциях рассматриваются способы передачи управления программному коду полезной нагрузки. Особое внимание уделяется поиску не зависимых от платформы решений и способам подмены сохраненного в стеке содержимого регистра EIP, которые позволяют выполнить нужный код. Для этого мало знать адрес размещения программного кода полезной нагрузки в памяти.
Явный переход.
Если программе переполнения буфера известен адрес программного кода полезной нагрузки, то можно передать ему управление при помощи явного переходаНеявный переход.
Регистр ESP указывает на текущее положение в стеке. Способ неявного перехода(blind return) основан натом, что любая командаВ ряде способов передачи управления программному коду полезной нагрузки используются регистры процессора для указания на область данных в стеке. Регистр EIP программно недоступен, поэтому нельзя подмененный указатель текущей команды непосредственно загрузить в регистр EIP и воспользоваться им для передачи управления в программе, как это показано на рис. 8.20. Для загрузки указателя текущей команды в регистр EIP указатель текущей команды должен указывать на реальную команду, как это показано на рис. 8.21.