Развитие технологий генерации эксплойтов на основе...

Preview:

Citation preview

Развитие технологий генерации эксплойтов на основе анализа

бинарного кода

Андрей Федотов и Вадим Каушан{fedotoff, korpse}@ispas.ru

Введение

• Эксплуатация переполнения буфера• Работа с трассой машинных инструкций• Использование символьного выполнения

для генерации эксплойта

Постановка задачи

• Известны данные, приводящие к аварийному завершению– Сетевой запрос– Файл– Параметр командной строки

• Дан шеллкод для целевой системы• Нужно создать массив данных, приводящий

к выполнению шеллкода

Что нужно?• Точка получения данных• Точка падения• Путь от получения данных до падения– Слайсинг трассы

• Предикат пути– Промежуточное представление

• Дополнительные уравнения– Предикат безопасности– Уравнения для шеллкода

• Решатель

Слайсинг трассы• Алгоритм работает с трассой инструкций• Выделяет релевантные инструкции• Распространение зависимостей• Виды

– Прямой (обработка буфера)– Обратный (создание буфера)

• Учёт зависимостей по данным на уровне машинных команд– Адресные (MOV EAX, [ECX+EDX])– Флаговые (CMP EAX,0; JZ addr)

• Позволяет значительно сократить количество обрабатываемых инструкций

Динамический анализ помеченных данных

• Taint-анализ: аналог слайсинга• Распространение помеченных данных• На каждом шаге фиксируем, какие данные

помечены– Изначально помечены входные данные– Поиск места перезаписи адреса возврата– Поиск буферов, в которых можно разместить

шеллкод

Поиск точек падения

• Нарушение нормального выполнения программы– Каждое нарушение выполнения порождает

прерывание– Обработка инструкций передачи управления

• Ложные срабатывания– Возврат из прерывания не попал в трассу– Штатное завершение программы

• exit()• ExitProcess()

Вход и выход из прерывания:

Вход и выход из прерывания:

Поиск точек получения данных

• Вызовы библиотечных функций– read, recv, ReadFile– Легко найти– Иногда вызовов очень много (ReadFile)

• Параметры командной строки– Поиск вызова main()

• Поиск по адресу• Обратный слайсинг– Когда нет информации о способе ввода данных

Промежуточное представление• В x86 много различных инструкций. Набор команд регулярно расширяется. • Есть и другие архитектуры: ARM, PowerPC, …• Целесообразно использовать промежуточное представление• Промежуточное представление Pivot

– «RISC-машина», 8 команд-операторов

Промежуточное представлениеADD EAX, ECX

INIT o.1:i16 = 0000hINIT o.2:i16 = 0008hLOAD t.0:i32 = r[o.1] ; load EAXLOAD t.1:i32 = r[o.2] ; load ECXAPPLY t.2 = add.i32(t.0, t.1)STORE r[o.1] = t.2 ; store EAX

INIT t.3:i16 = 0088hLOAD t.4:i16 = r[t.3] ; load EFLAGSINIT t.5:i16 = 08D5hAPPLY t.6 = x86.uf(t.4, t.5)STORE r[t.3] = t.6 ; store EFLAGS

SMT SOLVERS

Поддерживаемые и активно развивающиесярешатели: Alt-Ergo, Barcelogic, Beaver, Boolector, CVC3, DPT, MathSAT, OpenSMT,SatEEn, Spear, STP, UCLID, veriT, Yices, Z3

– Решатели используются в ряде проектов, ищущих ошибки в бинарном коде: Bitblaze, Mayhem, S2E, Avalanche, Sage, …

• Открытый исходный код;• Удобное С API;• Поддержка Windows & Linux;

Язык SMT

9

,2

,

,50

z

yxz

xy

x

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)

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

Пример описания инструкции add al,05

RAXRAX

EAXEAX

AXAX

ALAL AHAH

0

EСXEСX

СXСX

СLСL СHСH

RCXRCX

• Регистры и память представляем как массивы битовых векторов• К отдельным регистрам обращаемся по смещению• Регистры и память представляем как массивы битовых векторов• К отдельным регистрам обращаемся по смещению

Пример описания инструкции add al,05

Схема работы инструмента

Схема работы инструмента

Поиск ячейки перезаписи адреса возврата Фрагмент участка слайса, где происходит перезапись адреса возврата

Поиск шага паденияФрагмент участка трассы с падением

Плагин CrashInfo автоматически находит в трассе места возможных падений программ

Плагин CrashInfo автоматически находит в трассе места возможных падений программ

Схема работы инструмента

Схема работы инструмента

Схема работы инструмента

Боремся с ASLR • Ищем трамплины в исполняемых секциях• Трамплины – инструкции вида:– call reg opcode: 0xff 0xd?– jmp reg opcode: 0xff 0xe?

• Насколько вероятно найти в коде трамплин?

Размер Вероятность

10КБ 14,1%

50КБ 53,3%

100КБ 78,2%

500КБ 99,9%

Схема работы инструмента

Схема работы инструмента

Операционная система Приложение Уязвимости

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»

Операционная

системаПриложение Размер слайса

Размер

данных, байт

Время

решения, с

Время

генерации, с

Linux Corehttp 0.5.3 18293 565 1024 1367

МСВС konquerror 2493 536 8 128

WinXP SP3superplayer

35004855 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

Открытые вопросы и дальнейшие направления исследования

• Автоматизация поиска точек получения входных данных;

• Преодоление механизмов защиты;– DEP, gcc: stack protector + FORTIFY_SOURCE;

• Эксплуатация уязвимостей форматной строки;• Предотвращение досрочного аварийного завершения

– до срабатывания шеллкода;• Обработка символьных указателей;• Проведение экспериментов на архитектуре ARM• Автоматический перебор траекторий выполнения с

целью поиска ошибок

Вопросы?

Recommended