Upload
semen-martynov
View
315
Download
8
Embed Size (px)
Citation preview
Введение в динамический анализ приложений напримере Intel Pin
Чёрная команда
Санкт-Петербургский политехнический университет Петра Великого
Антон Абрамов <[email protected]>Владислав Бусаров <[email protected]>
Сергей Дедков <[email protected]>Семён Мартынов <[email protected]>
Николай Патраков <[email protected]>
17 октября 2015 г.
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 1 / 17
Содержание
1 Введение
2 Установка
3 Pintool для трассировки операций чтения/записи
Гранулярность Pin
Исходный код
Запуск pintool
4 Заключение
5 Источники
6 Вопросы
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 2 / 17
Введение: динамический анализ
Анализ программы – это один из фундаментальных этапов процессаразработки ПО. Он включает анализ с целью выявления поведенческихособенностей программы в период выполнения. Принято говорить одвух типа анализа: статический (изучался в курсе Моисеева М.Ю.) идинамический.
Преимуществом статического анализа является 100% покрытие кода,преимущество динамического анализа в том, что он может даватьдетализированную и точную информацию. Существует множествоспособов профилирования программы, например использованиесобытий инфраструктуры, точки подключения к ОС и динамическоеоснащение программы средствами мониторинга и протоколирования(instrumentation). Хотя Visual Studio или GDB предоставляетинфраструктуру профилирования, их возможности ограниченны. Длявсех сценариев динамического оснащения, кроме простейших, требуетсяболее совершенная инфраструктура, которую может предоставить Pin.
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 3 / 17
Введение: Pin
Pin – это инфраструктура динамического оснащения на уровнедвоичного кода (dynamic binary instrumentation framework),позволяющая создавать средства анализа программ, называемыеPintool для платформ Windows и Linux.
Инфраструктура (framework) – это набор кода, на основе которогопишется программа
Оснащение (instrumentation) – процесс анализа программыдобавлением и/или модификацией кода
Понятие двоичный указывает, что добавляемый илимодифицируемый код, представляет собой машинный код вдвоичной форме
Понятие динамический указывает, что процесс оснащенияосуществляется в период выполнения, пока программа работает.
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 4 / 17
Введение: принцип работы Pin
Рис. 1: Взаимодействие фреймворка и приложенияЧёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 5 / 17
Введение: основные возможности 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
Установка: инсталляция на основных системах
Системы на базе 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
Установка: проблемыОшибкаПри запуске на относительно свежем ядре (4+) программа завершаласьсо следующим сообщениемE: 4.1 is not a supported linux release:
РешениеИспользование параметра -ifeellucky позволяет использовать pin сосвежими ядрами linux.
ОшибкаНе корректная работа с программами, откомпилированными свежейверсией GCC (5+).
РешениеИспользование параметра -fabi-version=2 позволяет использоватьсвежую версию ABI.
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 8 / 17
Гранулярность Pin
Оснащение программы – вставка код в специфические местаисследуемой программы (обычно непосредственно до или послевыполнения конкретной инструкции или функции).
Для выбора подходящего компромисса между производительностью иуровнем детализации, существует три основных уровня гранулярностидля Pin:
подпрограмма (routine) – может оказаться слишком общим
инструкция (instruction) – может приводить к катастрофическомупадению производительности
образ (image) – требует символы
Помимо этого, существует трассировка, которая помогает выполнятьоснащение, не жертвуя производительностью или детализацией.
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 9 / 17
Исходный код (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
Исходный код (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
Исходный код (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
Запуск 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
Результат запуска
Журнал исследования системной утилиты 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
Заключение
Pin является эффективным инструментом для тонкого изучения работыпрограммы.
Основными достоинствами инструмента по нашему мнению является:
Отсутствие необходимости изучать дополнительные языки – длястатического анализа требуется изучить Promela, для работы сGDB нужны знания Assembler, для работы с LLVM пониманиесинтаксиса IR
Возможность работать не имея исходных кодов – достаточночастая необходимость, при изучении вредоносного ПО
Управляемая детализация отчётов - можно отфильтровать то, чтотребуется рассмотреть
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 15 / 17
Источники
Хади БраисИнструментированные приложений: Анализ приложений с помощью 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
Вопросы?
Чёрная команда (СПбПУ) Динамический анализ приложений 17 октября 2015 г. 17 / 17