Введение в динамический анализ приложений на примере...

17
Введение в динамический анализ приложений на примере Intel Pin Чёрная команда Санкт-Петербургский политехнический университет Петра Великого Антон Абрамов <[email protected]> Владислав Бусаров <[email protected]> Сергей Дедков <[email protected]> Семён Мартынов <[email protected]> Николай Патраков <[email protected]> 17 октября 2015 г. Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 1 / 17

Upload: semen-martynov

Post on 14-Jan-2017

311 views

Category:

Software


8 download

TRANSCRIPT

Page 1: Введение в динамический анализ приложений на примере Intel Pin

Введение в динамический анализ приложений напримере Intel Pin

Чёрная команда

Санкт-Петербургский политехнический университет Петра Великого

Антон Абрамов <[email protected]>Владислав Бусаров <[email protected]>

Сергей Дедков <[email protected]>Семён Мартынов <[email protected]>

Николай Патраков <[email protected]>

17 октября 2015 г.

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 1 / 17

Page 2: Введение в динамический анализ приложений на примере Intel Pin

Содержание

1 Введение

2 Установка

3 Pintool для трассировки операций чтения/записи

Гранулярность Pin

Исходный код

Запуск pintool

4 Заключение

5 Источники

6 Вопросы

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 2 / 17

Page 3: Введение в динамический анализ приложений на примере Intel Pin

Введение: динамический анализ

Анализ программы – это один из фундаментальных этапов процессаразработки ПО. Он включает анализ с целью выявления поведенческихособенностей программы в период выполнения. Принято говорить одвух типа анализа: статический (изучался в курсе Моисеева М.Ю.) идинамический.

Преимуществом статического анализа является 100% покрытие кода,преимущество динамического анализа в том, что он может даватьдетализированную и точную информацию. Существует множествоспособов профилирования программы, например использованиесобытий инфраструктуры, точки подключения к ОС и динамическоеоснащение программы средствами мониторинга и протоколирования(instrumentation). Хотя Visual Studio или GDB предоставляетинфраструктуру профилирования, их возможности ограниченны. Длявсех сценариев динамического оснащения, кроме простейших, требуетсяболее совершенная инфраструктура, которую может предоставить Pin.

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 3 / 17

Page 4: Введение в динамический анализ приложений на примере Intel Pin

Введение: Pin

Pin – это инфраструктура динамического оснащения на уровнедвоичного кода (dynamic binary instrumentation framework),позволяющая создавать средства анализа программ, называемыеPintool для платформ Windows и Linux.

Инфраструктура (framework) – это набор кода, на основе которогопишется программа

Оснащение (instrumentation) – процесс анализа программыдобавлением и/или модификацией кода

Понятие двоичный указывает, что добавляемый илимодифицируемый код, представляет собой машинный код вдвоичной форме

Понятие динамический указывает, что процесс оснащенияосуществляется в период выполнения, пока программа работает.

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 4 / 17

Page 5: Введение в динамический анализ приложений на примере Intel Pin

Введение: принцип работы Pin

Рис. 1: Взаимодействие фреймворка и приложенияЧёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 5 / 17

Page 6: Введение в динамический анализ приложений на примере Intel Pin

Введение: основные возможности Pin

Pin является закрытым ПО, но доступен для свободного скачивания ибесплатного использования для некоммерческих целей.

В текущей версии (Pin 2.13) заявлена поддержка следующих платформ:

Windows (IA32 и Intel64)

Linux (IA32 и Intel64)

Mac OS X (IA32 и Intel64)

Android (IA32)

Intel Xeon Phi (для суперкомпьютеров)

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 6 / 17

Page 7: Введение в динамический анализ приложений на примере Intel Pin

Установка: инсталляция на основных системах

Системы на базе Arch Linux (из Arch User Repository)yaourt -Sy pin

Системы на базе Debian/Ubuntu (из PPA)sudo add-apt-repository ppa:md+lp/pintool && sudo apt-get updatesudo apt-get install -y pintool

Системы на базе RHEL/Fedorasudo yum install -y pintool

Системы семейства Windows (не рекомендуется)Бинарные файлы скачиваются с официального сайта Intelhttp://intel.ly/1ysiBs4

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 7 / 17

Page 8: Введение в динамический анализ приложений на примере Intel Pin

Установка: проблемыОшибкаПри запуске на относительно свежем ядре (4+) программа завершаласьсо следующим сообщениемE: 4.1 is not a supported linux release:

РешениеИспользование параметра -ifeellucky позволяет использовать pin сосвежими ядрами linux.

ОшибкаНе корректная работа с программами, откомпилированными свежейверсией GCC (5+).

РешениеИспользование параметра -fabi-version=2 позволяет использоватьсвежую версию ABI.

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 8 / 17

Page 9: Введение в динамический анализ приложений на примере Intel Pin

Гранулярность Pin

Оснащение программы – вставка код в специфические местаисследуемой программы (обычно непосредственно до или послевыполнения конкретной инструкции или функции).

Для выбора подходящего компромисса между производительностью иуровнем детализации, существует три основных уровня гранулярностидля Pin:

подпрограмма (routine) – может оказаться слишком общим

инструкция (instruction) – может приводить к катастрофическомупадению производительности

образ (image) – требует символы

Помимо этого, существует трассировка, которая помогает выполнятьоснащение, не жертвуя производительностью или детализацией.

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 9 / 17

Page 10: Введение в динамический анализ приложений на примере Intel Pin

Исходный код (1/3)

Вспомогательные функции#include <stdio.h> // стандартный заголовочный файл ввода-вывода#include "pin.H" // задействовать Pin API

FILE * trace; // результат работы будут сохранены в журнал

// фиксация состояния регистра указателя инструкции и адреса памяти для операции ЧТЕНИЯ в журналVOID RecordMemRead(VOID * ip, VOID * addr) {

fprintf(trace,"%p: R %p\n", ip, addr);}

// фиксация состояния регистра указателя инструкции и адреса памяти для операции ЗАПИСИ в журналVOID RecordMemWrite(VOID * ip, VOID * addr) {

fprintf(trace,"%p: W %p\n", ip, addr);}

// процедура завершения вызываться при завершении оснащенной программыVOID Fini(INT32 code, VOID *v) {

fprintf(trace, "#eof\n");fclose(trace);

}

// вывод справочной информацииINT32 Usage() {

PIN_ERROR( "This Pintool prints a trace of memory addresses\n"+ KNOB_BASE::StringKnobSummary() + "\n");

return -1;}

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 10 / 17

Page 11: Введение в динамический анализ приложений на примере Intel Pin

Исходный код (2/3)

Гранулярность на уровне инструкции – функция Instruction()// Вызывается для каждой инструкции.// Будем исследовать только те инструкции, которые читают или пишут в память.VOID Instruction(INS ins, VOID *v) {

//Операнды, гарантированно получающие управлениеUINT32 memOperands = INS_MemoryOperandCount(ins);

// Итерируемся по всем операндам и инструкциямfor (UINT32 memOp = 0; memOp < memOperands; memOp++){

// Для операций чтения:if (INS_MemoryOperandIsRead(ins, memOp)){

INS_InsertPredicatedCall(ins, // Оснащаемая процедураIPOINT_BEFORE, //куда её вставлять (ПЕРЕД требуемой инструкцией)(AFUNPTR)RecordMemRead, //указатель на функцию анализа RecordMemReadIARG_INST_PTR, // аргументы, передаваемые в RecordMemReadIARG_MEMORYOP_EA, memOp,IARG_END); // признак конца списка аргументов

}// Для операций записи, аналогичноif (INS_MemoryOperandIsWritten(ins, memOp)){

INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite, //указатель на функцию анализа RecordMemWriteIARG_INST_PTR, IARG_MEMORYOP_EA, memOp, IARG_END);

}}

}

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 11 / 17

Page 12: Введение в динамический анализ приложений на примере Intel Pin

Исходный код (3/3)

Основная точка входа – функция main()// Этот pintool генерирует трассировку всех адресов памяти, на которые ссылается программа// (может быть полезно для отладки и для моделирования кэша данных в процессоре)int main(int argc, char *argv[]) {

// Разбор командной строки для инициализации переменных;// если переданы не верные параметры -- программа завершитсяif (PIN_Init(argc, argv)) return Usage();

// Журнал работы будет называться pinatrace.outtrace = fopen("pinatrace.out", "w");

// Регистрируем функцию оснащения Instruction()INS_AddInstrumentFunction(Instruction, 0);// Регистрируем функцию завершения Fini()PIN_AddFiniFunction(Fini, 0);

// Запуск анализируемой программы.// Эта функция никогда не возвращает управление функции main!!PIN_StartProgram();

return 0;}

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 12 / 17

Page 13: Введение в динамический анализ приложений на примере Intel Pin

Запуск pin

Проведём исследование стандартной утилиты pwd

Исследование системной утилиты pwd$ /opt/pin/intel64/bin/pinbin -t /opt/pin/source/tools/SimpleExamples/obj-intel64/pinatrace.so -- /bin/pwd

Команда запуска состоит из трёх частей:

/opt/pin/intel64/bin/pinbin путь к утилите pin

-t /opt/pin/source/tools/SimpleExamples/obj-intel64/pinatrace.soпуть к рассмотренному ранее pintool (фактически представляет изсебя динамическую библиотеку)

-- /bin/pwd путь к исследуемому бинарнику

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 13 / 17

Page 14: Введение в динамический анализ приложений на примере Intel Pin

Результат запуска

Журнал исследования системной утилиты pwd(последние 10 строк, общий объём порядка 3,5Мб)$ tail -n 25 pinatrace.out0x7f5c6717c178: W 0x7f5c674c3a400x7f5c6717c182: R 0x7f5c674c39e80x7f5c6717c196: R 0x7ffe8af724580x7f5c6717c197: R 0x7ffe8af724600x7f5c6717c198: R 0x7ffe8af724680x7f5c6717c19a: R 0x7ffe8af724700x7f5c6717c19c: R 0x7ffe8af724780x7f5c67138cda: W 0x7ffe8af724780x7f5c671c9fe3: R 0x7f5c674c2e68#eof

Каждая строка состоит из трёх полей

Адрес инструментованной инструкции (IARG_INST_PTR), т.е.куда передано управление

Вид операции (чтение или запись)

Адрес операции (IARG_MEMORYOP_EA), т.е. эффективныйадрес операции с памятью

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 14 / 17

Page 15: Введение в динамический анализ приложений на примере Intel Pin

Заключение

Pin является эффективным инструментом для тонкого изучения работыпрограммы.

Основными достоинствами инструмента по нашему мнению является:

Отсутствие необходимости изучать дополнительные языки – длястатического анализа требуется изучить Promela, для работы сGDB нужны знания Assembler, для работы с LLVM пониманиесинтаксиса IR

Возможность работать не имея исходных кодов – достаточночастая необходимость, при изучении вредоносного ПО

Управляемая детализация отчётов - можно отфильтровать то, чтотребуется рассмотреть

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 15 / 17

Page 16: Введение в динамический анализ приложений на примере Intel Pin

Источники

Хади БраисИнструментированные приложений: Анализ приложений с помощью PinMSDN Magazine Blog - ноябрь, 2014.

Intel CorporationPin 2.13 User Guidehttps://software.intel.com/sites/landingpage/pintool/docs/65163/Pin/html/index.html

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 16 / 17

Page 17: Введение в динамический анализ приложений на примере Intel Pin

Вопросы?

Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 17 / 17