отол. 1_лек. Анализ кода и его применение
Скачать 2.61 Mb.
|
Анализ кода и его применениеГетьман Александр thorin@ispras.ru Заинтересованные стороны Разработчики ПО − Устранение ошибок и уязвимостей − Понимание работы старых модулей − Интеграция со сторонним ПО − Отладка и сопровождение ПО − Оптимизация производительности Антивирусные лаборатории − Анализ поведения вредоносного кода Службы безопасности − Расследование инцидентов Органы сертификации − Сертификация ПО для использования в госучреждениях Возникающие задачиПоиск ошибок, их классификация, и определение условий их возникновения и способов устранения Поиск недокументированных возможностей Предотвращение нарушений конфиденциальности, целостности и доступности Извлечение и описание отдельных алгоритмов Анализ протоколов передачи данных Какой код анализируется? Оборудование: Персональные компьютеры, сервера Коммуникационное оборудование Микроконтроллеры Мобильные устройства Специализированные устройства Архитектуры: x86, ARM, MIPS, PowerPC, … Пример «нестандартнго случая» Поведение определяется обрабатываемыми данными • Нестандартная операционная система − Наилучший случай: модифицированный Linux, BSD Доступна только прошивка, часть аппаратуры неизвестна Что такое анализ кода? Получение модели программы, удобной для алгоритмов Автоматическое восстановление или проверка свойств модели Визуализация удобная для ручного анализа Статическое представление программы Программа PDG Объекты анализа
Сравнение статического и динамического анализа
Сложность анализа бинарного кода Сложность дизассемблирования − Принцип фон Неймана − Вычисляемые переходы Сложность получения трассы − Подбор параметров − Замедление выполнения Сложность восприятия − Отсутствие параметров, переменных (вместо них — регистры и ячейки памяти) − Отсутствие «привычных» функций − Отсутствие управляющих конструкций (if, then, else, switch, for, while,...) Что такое функция? • Функция возвращает управление на инструкцию, следующую за вызовом функции Существуют исключения: exit(), fork() и т.д. Зачем анализировать бинарный код? Отсутствие исходного кода Проблема «What You See Is Not What You eXecute» Комплексный анализ программы вместе с окружением (ОС, библиотеки и т.д.) Схема анализа бинарного кода
Актуальные направления исследований Разработка средств получения исходных данных − Дизассемблеры − Средства получения трассы Разработка инфраструктуры для анализа и получения статического представления Разработка алгоритмов анализа Примеры алгоритмов анализа ●Статический и динамический слайсинг ●Восстановление множеств возможных значений переменных ●Восстановление типов данных ДизассемблированиеПроблемы: Код какой архитектуры? Что дизассемблировать? Принцип фон Неймана При каких условиях? Разные режимы работы процессора Алгоритмы: Линейный Рекурсивный Красивый пример: Трасса Наложение инструкций выполнения
Получение трассыПроблемы: ●Замедление процесса выполнения ●Пользовательский код и код ядра ОС ●Взаимодействие по сети Методы: ●Статическое инструментирование (s-spider) ●Динамическое инструментирование (Valgrind, Pin) ●Виртуальные машины (TEMU, ...) ●Двухпроходная трассировка(VMVare ReTrace) Двухпроходная трассировкаЦель – получение детальной трассы, исключая возможность обнаружения процесса трассировки извне Все взаимодействие с внешним окружением фиксируется на первом этапе в журнале событий − Крайне низкие накладные расходы на трассировку Второй этап – детерминированное воспроизведение − Подключение интерактивного отладчика − Снятие детальной трассы для последующего анализа Зачем защищать код от анализа? ●Коммерческая тайна (коммерческое ПО) ●Увеличение времени анализа и понимания кода (вирусное ПО) ●Информационная безопасность Классификация методов защиты Защита от статического анализа: ●Проверка целостности ●Динамическая распаковка ●Самомодификация ●Вычисляемые переходы Защита от динамического анализа: ●Подсчёт времени выполнения ●Контроль отладочных прерываний и регистров ●Поиск систем отладки Усложнение кода (оптимизации): ●Сокрытие вызовов и возвратов функций ●«Деформирование» CFG ●Смешивание потоков данных и управления Пример: выход из нескольких функций Main: CALL FuncA Main MOV EAX, 0 FuncA: JMP @FuncB FuncB: MOV EAX, 1 RET Trace:CALL FuncA JMP @FuncB MOV EAX, 1 RET MOV EAX, 0 Методы внедрения защиты от анализаНавесная: упаковка/шифрование исполняемого файла − Последний этап защиты после компиляции из исходных кодов, с учетом дополнительной информации полученной при компиляции Встраиваемая − Запутывание программного кода во время компиляции − Встраивание различных приемов, защиты от тестирования отладчиками Пример часто применяемой: виртуальная машина − Встраивание интерпретатора инструкций сторонней архитектуры и исполнение на нем частей программы Средства анализаСтатический анализ − Двоичный редактор − Дизассемблер (IDA Pro) − Декомпилятор (IDA Pro/HexRays) − Алгоритмы анализа (IDA Pro + дополнения) Динамический анализ − Обычный отладчик, Отладчик ядра (SoftICE, OllyDbg, WinDbg) − Средства получения трассы (Valgrind) Системы анализа − BitBlaze, CodeSurfer/x86, IDA Pro, BAP, Dyninst, ... Недостатки и достоинства IDA ProСтатическое представление программы – естественное для человеческого мышления Косвенная адресация и динамическое изменение кода − Восстановленное статическое представление не полное IDA Pro анализирует отдельный модуль − Минимальные ухищрения – доступно все адресное пространство процесса IDA Pro – инфраструктура − Анализ – IDC-скрипты и модулирасширения, иногда очень дорогие (Zynamics, поглощенный Google) |