2. Введение
• Эксплуатация переполнения буфера
• Работа с трассой машинных инструкций
• Использование символьного выполнения
для генерации эксплойта
3. Постановка задачи
• Известны данные, приводящие к
аварийному завершению
– Сетевой запрос
– Файл
– Параметр командной строки
• Дан шеллкод для целевой системы
• Нужно создать массив данных, приводящий
к выполнению шеллкода
4. Что нужно?
• Точка получения данных
• Точка падения
• Путь от получения данных до падения
– Слайсинг трассы
• Предикат пути
– Промежуточное представление
• Дополнительные уравнения
– Предикат безопасности
– Уравнения для шеллкода
• Решатель
5. Слайсинг трассы
• Алгоритм работает с трассой инструкций
• Выделяет релевантные инструкции
• Распространение зависимостей
• Виды
– Прямой (обработка буфера)
– Обратный (создание буфера)
• Учёт зависимостей по данным на уровне машинных
команд
– Адресные (MOV EAX, [ECX+EDX])
– Флаговые (CMP EAX,0; JZ addr)
• Позволяет значительно сократить количество
обрабатываемых инструкций
6.
7. Динамический анализ помеченных
данных
• Taint-анализ: аналог слайсинга
• Распространение помеченных данных
• На каждом шаге фиксируем, какие данные
помечены
– Изначально помечены входные данные
– Поиск места перезаписи адреса возврата
– Поиск буферов, в которых можно разместить
шеллкод
8.
9. Поиск точек падения
• Нарушение нормального выполнения
программы
– Каждое нарушение выполнения порождает
прерывание
– Обработка инструкций передачи управления
• Ложные срабатывания
– Возврат из прерывания не попал в трассу
– Штатное завершение программы
• exit()
• ExitProcess()
12. Поиск точек получения данных
• Вызовы библиотечных функций
– read, recv, ReadFile
– Легко найти
– Иногда вызовов очень много (ReadFile)
• Параметры командной строки
– Поиск вызова main()
• Поиск по адресу
• Обратный слайсинг
– Когда нет информации о способе ввода данных
13. Промежуточное представление
• В x86 много различных инструкций. Набор команд регулярно расширяется.
• Есть и другие архитектуры: ARM, PowerPC, …
• Целесообразно использовать промежуточное представление
• Промежуточное представление Pivot
– «RISC-машина», 8 команд-операторов
17. Z3: C API
• Создание конфигурации
Z3_mk_config ()
• Создание контекста
Z3_mk_context (__in Z3_config c)
• Типы
Z3_mk_bv_sort (__in Z3_context c, __in unsigned sz)
Z3_mk_array_sort (__in Z3_context c, __in Z3_sort domain, __in Z3_sort
range)
• Создание символов
Z3_mk_string_symbol (__in Z3_context c, __in Z3_string s)
• Создание переменных
Z3_mk_const (__in Z3_context c, __in Z3_symbol s, __in Z3_sort ty)
18. Z3: C API
• Логические операции
Z3_mk_true (__in Z3_context c)
Z3_mk_eq (__in Z3_context c, __in Z3_ast l, __in Z3_ast r) etc.
• Операции с битовыми векторами (машинными типами данных)
Z3_mk_bvand (__in Z3_context c, __in Z3_ast t1, __in Z3_ast t2)
Z3_mk_bvult (__in Z3_context c, __in Z3_ast t1, __in Z3_ast t2) etc.
• Операции с массивами
Z3_mk_select (__in Z3_context c, __in Z3_ast a, __in Z3_ast i)
Z3_mk_store (__in Z3_context c, __in Z3_ast a, __in Z3_ast i, __in Z3_ast v)
• Решение и получение модели
Z3_mk_solver (__in Z3_context c)
Z3_solver_check (__in Z3_context c, __in Z3_solver s)
Z3_solver_get_model (__in Z3_context c, __in Z3_solver s)
Z3_solver_assert (__in Z3_context c, __in Z3_solver s, __in Z3_ast a) etc
19. Пример описания инструкции add al,05
RAXRAX
EAXEAX
AXAX
ALAL AHAH
0
EСXEСX
СXСX
СLСL СHСH
RCXRCX
• Регистры и память представляем как массивы битовых векторов
• К отдельным регистрам обращаемся по смещению
• Регистры и память представляем как массивы битовых векторов
• К отдельным регистрам обращаемся по смещению
23. Поиск ячейки перезаписи адреса возврата
Фрагмент участка слайса, где происходит перезапись адреса возврата
24. Поиск шага падения
Фрагмент участка трассы с падением
Плагин CrashInfo
автоматически находит в
трассе места возможных
падений программ
Плагин CrashInfo
автоматически находит в
трассе места возможных
падений программ
33. Операционная система Приложение Уязвимости
Linux Corehttp 0.5.3 CVE:2007-4060
МСВС konquerror CVE:2004-0597
Windows XP SP3 superplayer 3500 EDB-ID:27041
Linux iwconfig v26 CVE:2003-0947
Windows XP SP2 Lhttpd 0.1 CVE:2002-1549
Linux get_driver «0day»
Linux mkfs.jfs «0day»
Linux alsa_in «0day»
34. Операционная
система
Приложение Размер слайса
Размер
данных, байт
Время
решения, с
Время
генерации, с
Linux
Corehttp
0.5.3
18293 565 1024 1367
МСВС konquerror 2493 536 8 128
WinXP SP3
superplayer
3500
4855 594 <1 66
Linux iwconfig v26 124 80 <1 7
WinXP SP2 Lhttpd 0.1 20174 320 18 245
Linux get_driver 152 272 2 41
Linux mkfs.jfs 209 407 3 23
Linux alsa_in 241 58 <1 40
35. Открытые вопросы и дальнейшие
направления исследования
• Автоматизация поиска точек получения входных
данных;
• Преодоление механизмов защиты;
– DEP, gcc: stack protector + FORTIFY_SOURCE;
• Эксплуатация уязвимостей форматной строки;
• Предотвращение досрочного аварийного завершения
– до срабатывания шеллкода;
• Обработка символьных указателей;
• Проведение экспериментов на архитектуре ARM
• Автоматический перебор траекторий выполнения с
целью поиска ошибок