На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Трассировка во время выполнения программы

В процесс трассировки во время выполнения программы входит расстановка точек останова и пошаговое выполнение программы для составления ее рабочей модели. При выполнении программы можно проследить поток данных и поток команд управления, просто просматривая, что происходит. Для сложных приложений, это, как правило, намного полезнее, чем любой вид статического анализа программного кода. На время создания этой книги еще не было доступным большое количество программных средств, которыми можно было бы воспользоваться для проведения трассировки в режиме выполнения, особенно тех, которые бы позволяли выявить проблемы безопасности. Одна из многообещающих программ называется Fenris, и она работает на платформе Linux (4).
При трассировке во время выполнения особое значение имеет охват кода. Цель в том, чтобы "посетить" все возможные фрагменты программного кода, в которых могут произойти нежелательные события (по отношению к тестированию программ критерий охвата программного кода равнозначен охвату потенциальных уязвимых мест). Во многих случаях (к разочарованию хакера) можно найти потенциальное уязвимое место, но до него невозможно добраться. В этом случае можно изменять вредоносные входные данные до тех пор, пока не удастся добраться до интересующей области программного кода. Для этой цели лучше всего воспользоваться программой для исследования кода в режиме выполнения и поиска потенциально уязвимых мест (code coverage tool).
На 5 интересующий нас фрагмент кода содержит вызов функции wsprintf. Успешно "посещенные" блоки кода показаны как серые квадраты.
Чтобы оценить охват кода для конкретных фрагментов кода, мы создали простую программу, в которой объединили IDA-Pro и отладчик. С помощью специального модуля для IDA-Pro мы получили доступ к конкретным блокам кода исследуемой программы. Затем эти блоки были проанализированы во время выполнения с помощью установки в отладчике точек останова в начале каждого блока кода. При дости­жении точки останова блок кода выделяется серым цветом5.

Изменяя входные данные и отслеживая, как принимается решение о переходе к той или иной ветке кода, хакер может подобрать такие входные данные, которые позволят добраться до уязвимого блока кода. Практически никогда невозможно с первого раза добраться до уязвимой области кода (как показано на 6). Хакер должен очень внимательно проанализировать каждое решение о переходе к другой об­ласти кода и соответственно манипулировать входными данными. Это требует длительного использования отладчика.
Быстрые остановы
Во многих случаях понять, когда достигается определенная область кода, можно с помощью непосредственной выборки данных из памяти. Иногда целесообразно даже задать автоматическое выполнение определенных действий при достижении точки останова. Мы называем это быстрым остановом (speedbreak). При достижении интересующей точки останова исследуется каждый регистр. Если в регистре хранятся ссылки на выделенные области памяти, то делается выборка данных из памяти. Этот метод позволяет узнать, как анализаторы обрабатывают строки и как осуществляется преобразование символов. Можно даже отслеживать прохождение предоставленных пользователем данных.
На Windows-системе использовать этот метод достаточно просто: каждое значение регистра сохраняется в структуре контекста при возникновении отладочного события (см. главу 3, "Восстановление исходного кода и структуры программы"). Для каждого регистра отладчик вызывает функцию VirtualQuery () для определения того, существует ли выделенная область памяти. При положительном результате берется выборка данных из памяти и программе разрешается продолжить выполнение.
На 7 показано окно программы для проведения быстрых остановов, использованной для выборки данных из памяти при работе FTP-сервера. Мы видим данные в памяти при обработке SQL-запроса. Эта программа общедоступна на сайте http: //www. source forge . net (см. раздел projects/speedbreak/).
Отслеживание данных в буфере
Один из методов отслеживания входных данных заключается в установке точки останова в области кода, в которой располагается буфер для входных данных. С этой точки можно начать пошаговое исследование кода и проследить, когда запрашиваются или копируются данные из буфера. Такую трассировку можно осуществить с помощью программы Fenris. В нашем наборе средств также есть простая программа для проведения такой трассировки в системах Windows.
На 8 показана трассировка памяти. Используя этот метод визуализации, мы можем проследить за состоянием одного буфера данных с течением времени. Основная цель заключается в том, чтобы определить, где и когда данные передаются из регистров в стек и кучу с помощью операций чтения и записи. Зная, где находятся данные, значительно проще создать программу атаки.
"Ход конем"
"Ход конем" (leapfrogging) представляет собой ускоренный метод отслеживания входных данных. Вместо того чтобы медленно исследовать каждую строку кода, можно установить точки останова с чтением данных из памяти для буферов, в которых сохраняются предоставленные пользователем данные. В процессорах Intel семейства х86 поддерживается возможность установки отладочных точек останова для доступа к памяти. К сожалению, не все стандартные отладочные программы предоставляют эту функциональную возможность. Для этой цели можно воспользоваться одной из программ Softlce или OllyDbg.
Как и при обычной трассировке входных данных, точка останова устанавливается на точке входа в программу. При выполнении чтения данных из буфера, для него может быть установлена точка останова с доступом к памяти. Затем можно разрешить продолжение выполнения программы. До этого момента мы не отслеживаем, какие области кода исполняются, или как работает управляющая логика (поток команд управления) программы. Основа этого метода в том, что при попытке любой части программы получить доступ к буферу с пользовательскими данными, выполнение программы будет остановлено, и хакер сможет определить строку кода, которая стремится получить доступ к буферу. Хотя этот метод не настолько эффективен, как трассировка кода вручную (поскольку собирается меньше сведений о правилах работы программы), мы по-прежнему способны исследовать каждую область кода, в которой читаются данные из буфера пользовательских данных.
Этот метод нельзя назвать простым. Дело в том, что данные из пользовательского буфера копируются постоянно. Когда бы это не происходило, мы получаем точку останова, но скопированные данные сохраняются в других областях памяти и регистрах центрального процессора. Если не сделать пошагового анализа, невозможно проследить за данными, которые "покинули" пользовательский буфер. Для выполнения полного анализа требуется установка дополнительных точек останова для всех скопированных фрагментов данных. Очевидно, что количество точек останова будет очень большим. Поскольку процессоры Intel поддерживают установку только четырех точек останова с доступом к памяти, вы быстро превысите это предельное значение. В сложных программах распространение данных очень трудно проследить при таком способе анализа вручную. Однако одновременное использование методов "ход конем" и отслеживания входных данных предоставляет инженеру по восстановлению исходного кода вполне достаточный объем информации.
Преимущество метода "ход конем" состоит в том, что с его помощью можно создать некоторые программы для проведения атак. А недостаток его в том, что можно пропустить многие сложные проблемы. Таким образом (и это весьма любопытно) метод "ход конем" значительно полезнее для хакеров, чем для специалистов по обеспечению защиты.
Точки останова для страниц памяти
Один из вариантов метода "ход конем" заключается в изменении защиты для больших фрагментов памяти. Вместо того чтобы использовать конкретную точку останова для доступа к памяти, отладчик изменяет защиту для всей страницы памяти. Если программный код пытается получить доступ к обозначенной странице, то происходит исключение. Затем отладчик может быть использован для исследования события и определения того, коснулись ли изменения буфера пользовательских данных. Программа OllyDbg поддерживает этот тип исследования программного кода.
Поиск по шаблону
Еще одним прекрасным методом для ускорения процесса анализа программного кода является метод поиска по шаблону (boron tagging). Согласно этому методу, или в ответ на пошаговое событие, или в ответ на срабатывание точки останова при "ходе конем" отладчик настраивается на исследование всех областей памяти, адреса которых хранятся в регистрах центрального процессора. Если в какой-либо выборке данных из памяти содержится заданная строка, то эта область памяти помечается как "область, в которой обрабатываются предоставленные пользователем данные" (т.е. та область, которая нас интересует). Хитрость в том, чтобы подать на вход программы конкретную "магическую"строку входных данных в надежде на то, что эта строка успешно пройдет через весь код программы к точке обнаружения. При определенной степени везения можно получить "карту" всех областей кода, в которых обрабатываются пользовательские данные. Безусловно, этот метод не принесет успеха, если строка данных будет проигнорирована или преобразована в другую форму до того, как она достигнет интересных мест в программном коде.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика