Динамический анализ исполняемого кода в формате
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)
● Поддержка дополнительных наборов инструкций
● Оптимизация структуры инструментационного кода
30/29
[Nr] Name Addr Size[0] NULL 0 0[1] .interp 10154 13[2] .note.ABItag 10168 20[3] .note.gnu.buildid 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.ABItag 10168 20[3] .note.gnu.buildid 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