TMPA-2015: The dynamic Analysis of Executable Code in ELF Format Based on Static Binary...

30
Динамический анализ исполняемого кода в формате ELF на основе статической бинарной инструментации Михаил Ермаков ИСП РАН, Москва Санкт-Петербург, 12.11.2015

Transcript of TMPA-2015: The dynamic Analysis of Executable Code in ELF Format Based on Static Binary...

Динамический анализ исполняемого кода в формате

ELF на основе статической бинарной инструментации

Михаил ЕрмаковИСП РАН, Москва

Санкт-Петербург, 12.11.2015

2/29

Содержание

● Динамический анализ: цели и подходы● Динамический анализ: задача обхода путей● Статическая инструментация: подзадачи и

методы решения● Статическая инструментация: практическая

реализация

3/29

Динамический анализ

● Исследование в рамках выполнения программы

● Отслеживание событий– Временные

– Позиционные

– Функциональные

● Проверка свойств● Формирование статистики, трасс

4/29

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

● Аппаратные подходы● Внешние программные средства● Эмуляторы/виртуальные машины● Инструментация:

– исходного кода

– статическая

– динамическая

5

Динамический анализ:инструментация (1)

● Внедрение дополнительного кода, выполняющегося как побочный эффект

● Позволяет работать на уровне блоков инструкций

● Накладные расходы:– разбор

– модификация

– внедряемый код

6/29

Динамический анализ: инструментация (2)

● Динамическая– Во время выполнения

– Точность выше

– Локальная трансформация

● Статическая– Предварительно, независимо от среды выполнения

– Точность ниже

– Глобальная трансформация

7/29

Динамический анализ: статическая инструментация

● Позволяет манипулировать на низком уровне (+)● Эффективна при многократных запусках (+)● Интегрируема со статическим анализом

бинарного кода (+)● Чёткое ограничение модифицируемого кода (+/-)● Нет прямого соотношения с выполняемым кодом

(-)

8/29

Содержание

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

путей● Статическая инструментация: подзадачи и

методы решения● Статическая инструментация: практическая

реализация

9/29

Динамический анализ: автоматический обход путей

● Итеративное выполнение на различных наборах данных:– Отслеживание потока данных, зависимых от

входных, — помеченных данных

– Создание трассы операций потока помеченных данных в виде булевых формул (ограничений)

– Модификация трассы и разрешение ограничений для создания новых наборов данных

10/29

Автоматический обход путей: поток помеченных данных (1)

int x = read(...)

int y = x;

if (y < 0)

do1();

else

do2();

x : bitvector(32);

y : bitvector(32);

taint (x);

assert (y = x);

assert (y < 0 = true);

... // do1()

11/29

Автоматический обход путей: поток помеченных данных (2)x : bitvector(32);

y : bitvector(32);

taint (x);

assert (y = x);

assert (y < 0 = false);

int x = read(...)

int y = x;

if (y < 0)

do1();

else

do2();

12/29

Автоматический обход путей: особенности задачи

● Повторные запуски● Экспоненциальный рост числа путей● Сложность задачи проверки выполнимости

трассы ограничений

13/29

Содержание

● Динамический анализ: цели и подходы● Динамический анализ: задача обхода путей● Статическая инструментация: подзадачи

и методы решения● Статическая инструментация: практическая

реализация

14/29

Статическая инструментация: последовательность действий

● Вход: (точка инструментации, код инструментации)

● Разбор исполняемого кода, инстанциация пар для спецификаций

● Генерация исполняемого кода инструментации в виде набора блоков

● Внедрение нового кода

15/29

Статическая инструментация: формат ELF

● Состоит из секций, обладающих виртуальным адресом — позицией в образе памяти

● Возможны относительные зависимости между секциями

● Возможны относительные зависимости внутри секций

● Секции объединяются в сегменты, возможность изменений ограничена

Заголовок

.hash

.dynsym

.dynstr

.text

.plt

.got

.dynamic

...

16/29

Статическая инструментация: внедрение кода (1)

● Решение: добавление инструментационного кода в виде дополнительных секций

● В точках инструментации — инструкции перехода в .text_s

● В конце блоков .text_s — инструкции обратного перехода

● Заменённые инструкции — перед концом блоков .text_s

Заголовок

.hash

.dynsym

.dynstr

.text

.plt

.got

.dynamic

...

.text_s

17/29

Статическая инструментация: внедрение кода (2)

.text

А:Инструкция AB:Инструкция B…C:Инструкция C

.text

А:ПереходB:Инструкция B…C:Инструкция C

.text_s

1:Инструкция SSX:Инструкция XY:Инструкция Y…Z:Инструкция Z2:Инструкция SR3:Инструкция AR:Переход

.text_s

1:NOPX:Инструкция XY:Инструкция Y…Z:Инструкция Z2:NOP3:NOPR:NOP

SS — инструкция сохранения состоянияSR — инструкция восстановления состоянияNOP — «пустая» инструкция

18/29

Статическая инструментация: внедрение кода (3)

• Возможные проблемы:

1)Инструкции в составе блоков

2)Инструкции зависят от позиции

3)Инструкции перехода больше по размеру

• Решения:

1)Перенос блоков (разбиение по блокам .text_s)

2)Трансформация инструкций в эквивалентные

3)Перенос блоков

19/29

Статическая инструментация:оптимизация переходов (1)

● Расширение заменяемой инструкции до блока

● Объединение блоков инструментационного кода

20/29

Статическая инструментация: оптимизация переходов (2)

.text

А:Инструкция A ⇒ переходB:Инструкция BC:Инструкция CD:Инструкция D ⇒ переходE:Инструкция E

.text_s

Блок 11:Инструкция SS...2:Инструкция SR3:Инструкция A4:Инструкция B5:Инструкция CR:ПереходБлок 26:Инструкция SS...7:Инструкция SR8:Инструкция DR:Переход

21/29

Статическая инструментация:коррекция зависимостей (1)

● Целевой исполняемый код — внешние зависимости X

● Инструментационный код — внешние зависимости Y

● Зависимость d∈Y, d∉X ⇒ необходимо расширить X

● Зависимость d Y, d X необходимо ∈ ∈ ⇒скорректировать d под X

22/29

Статическая инструментация:коррекция зависимостей (2)

● Информация о зависимостях — специальные секции (.rel.*, .plt, .got и др.)

● Добавление зависимостей — расширение секций

● Выставление зависимостей и корректировка смещений (аналогично компоновщику)

23/29

Содержание

● Динамический анализ: цели и подходы● Динамический анализ: задача обхода путей● Статическая инструментация: подзадачи и

методы решения● Статическая инструментация:

практическая реализация

24/29

Практическая реализация: схема работы

Спецификациимодуля

инструментации

Объектный файлкода

инструментации

ИсходныйARM ELF файл

ARM ELF файл:расширение

секций

Кодинструментации

ARM ELF файл:коррекция

зависимостей

Кодинструментации

ARM ELF файл:полная

инструментация

Кодинструментации

objdump + gcc

readelf+

objcopyaddsymbol

rewriter

25/29

Практическая реализация: ограничения

● Поддержка только для ARM, Thumb-2 (ARMv7)

● Поддержка ограниченного количества типов точек инструментации

● Наличие таблицы символов для точности работы objdump (маркеры ARM/Thumb)

26/29

Практическая реализация: применение для анализа

● Инструмент Avalanche: автоматический обход путей и обнаружение дефектов

● tracegrind, covgrind: Valgrind ⇒ статика

tracegrindУправляющий

модуль

covgrind

STP

программа+

входные данные

трасса выполнения

программа+

входные данные

дефекты+

значения эвристики

наборы булевых ограничений

новые наборы входных данных

27/29

Практическая реализация: результаты применения

итерации дефекты (Tr + Cg)/STP

статика динамика статика динамика статика динамика

swfdump 575 105 4 1 72/28 87/13

mpeg2dec 302 55 1 1 37/63 89/11

cjpeg 1331 236 1 1 10/90 88/12

qtdump 1027 189 1 1 21/79 80/20

mpeg3dump 125 54 2 1 41/59 76/24

28/29

Направления дальнейших исследований

● Интеграция с системами статического анализа исполняемого кода (например, BAP)

● Поддержка дополнительных наборов инструкций

● Оптимизация структуры инструментационного кода

29/29

Спасибо за внимание!

30/29

[Nr] Name Addr Size[0] NULL 0 0[1] .interp 10154 13[2] .note.ABI­tag 10168 20[3] .note.gnu.build­id 10188 24[4] .hash 101ac 30[5] .gnu.hash 101dc 34[6] .dynsym 10210 70[7] .dynstr 10280 4d[8] .gnu.version 102ce e[9] .gnu.version_r 102dc 20[10] .rel.dyn 102fc 8[11] .rel.plt 10304 30[12] .init 10334 c[13] .plt 10340 5c[14] .text 1039c 1a0[15] .fini 1053c 8[16] .rodata 10544 4[17] .ARM.exidx 10548 8[18] .eh_frame 10550 4[19] .init_array 20f04 4[20] .fini_array 20f08 4[21] .jcr 20f0c 4[22] .dynamic 20f10 f0[23] .got 21000 28[24] .data 21028 8[25] .bss 21030 8[36] .shstrtab 0 170[37] .symtab 0 7a0[38] .strtab 0 3ae

[Nr] Name Addr Size[0] NULL 0 0[1] .interp 10154 13[2] .note.ABI­tag 10168 20[3] .note.gnu.build­id 10188 24[4] .hash 101ac 30[5] .gnu.hash 101dc 34[6] .dynsym 10210 80[7] .dynstr 1064c 65[8] .gnu.version 10290 10[9] .gnu.version_r 102ac 40[10] .rel.dyn 102fc 8[11] .init 102a0 c[12] .plt 10334 68[13] .text 1039c 1a0[14] .fini 1053c 8[15] .rodata 10544 4[16] .ARM.exidx 10548 8[17] .eh_frame 10550 4[18] .init_array 20f04 4[19] .fini_array 20f08 4[20] .jcr 20f0c 4[21] .dynamic 10554 f8[22] .got 21000 28[23] .data 21028 8[24] .bss 21030 8[35] .rodata_s 21590 1000[36] .text_s 2103c 554[37] .got2 21038 4[38] .rel.plt 23590 60[39] .shstrtab 0 188[40] .symtab 0 7d0[41] .strtab 0 3ae