Применение системы динамического инструментирования Pin. Выявление поведенческих сигнатур в бинарном коде. Модификация поведения бинарного кода.
Задание посвящено ознакомлению с системой динамического инструментирования бинарного кода Pin. Следующее описание гипотетической ситуации служит неформальной постановкой задачи.
В наши руки попала «сырая» версия крипто-локера, в котором ещё не реализован функционал по обходу файловой системы и вымоганию денег, но уже реализовано само шифрование. Особая удача заключается в том, что среди полученных материалов было несколько версий программы шифрования encrypt и несколько версий программы расшифровки decrypt. Наши специалисты провели предварительный анализ полученных образцов и выяснили следующее.
- Все бинарные модули собраны статически и из них не удалены символы.
- Судя по всему, все программы используют алгоритм симметричного шифрования Blowfish (термин «симметричное шифрование» означает, что для шифрования и дешифрования применяется один и тот же ключ) в реализации библиотеки libcrypto из пакета OpenSSL. В символах мы видим функцию BF_set_key, которая используется для задания ключа шифрования (ключом при этом считается буфер, задаваемый параметрами data и len, а не внутренняя структура библиотеки key).
- Разные версии encrypt и разные версии decrypt работают с разными ключами. Мы не смогли найти пару encrypt-decrypt, которая бы работала с одним и тем же ключом.
- Разные версии программ также отличаются адресами символов, но сами символы в них одинаковые.
Мы просим вас реализовать два Pin-инструмента: первый, который позволит в динамике извлечь используемый ключ из одной из версий программы encrypt, и второй, который заменит используемый ключ в программе decrypt на заданный. Таким образом мы сможем получить все ключи шифрования и применить их для расшифровки.
Для работы вам передаётся одна версия encrypt, одна версия decrypt (с разными используемыми ключами), а также один файл, зашифрованный вашей версией encrypt, с названием encrypted.sample.
Подготовка к выполнению задания
Выполните следующую последовательность действий для подготовки к выполнению задания.
- Разверните образ виртуальной машины и запустите его в ПО Oracle VirtualBox. Обратите внимание, что используется та же самая виртуальная машина, что и в первом задании. Повторно скачивать образ не требуется.
- Войдите в гостевую Linux-систему с именем пользователя student без пароля. Из-за лицензионных ограничений Pin мы не можем включить развёрнутый архив в образ, его придётся скачать отдельно:
- Изнутри виртуальной машины скачайте архив с персональным вариантом при помощи утилиты wget и распакуйте его, например:
Подзадачи
Далее формально описаны подзадачи, которые необходимо решить. Подзадачи решаются в прямом порядке: для решения второй сначала потребуется решить первую.
Подзадача 1: извлечение ключа шифрования из программы encrypt
В рамках данной подзадачи необходимо реализовать Pin-инструмент, позволяющий во время работы программы encrypt получить используемый ключ шифрования (в виде набора байтов) и сохранить его в двоичном виде в файл encrypt.key в текущем каталоге.
Чтобы подзадача считалась успешно решённой, вам необходимо сдать в тестирующую систему файл encrypt.key, содержащий извлечённый ключ, и исходный код разработанного инструмента. Возможна выборочная очная защита сданного кода в случае интересных применённых решений или подозрения на плагиат.
Подзадача 2: динамическая модификация программы decrypt с подменой ключа шифрования
В рамках данной подзадачи необходимо реализовать Pin-инструмент, позволяющий во время работы программы decrypt подменить используемый ей ключ шифрования на расположенный в текущем каталоге в файле decrypt.key.
Чтобы подзадача считалась успешно решённой, вам необходимо сдать в тестирующую систему файл, полученный в результате расшифровки файла encrypted.sample, и исходный код разработанного инструмента. Возможна выборочная очная защита сданного кода в случае интересных применённых решений или подозрения на плагиат.
Требования к реализации Pin-инструменов
Далее перечислены требования к реализуемым в рамках решения подзадач задания инструментам.
- Инструменты сдаются в виде исходного кода.
- Инструмент должен быть реализован полностью в одном .cpp-файле, не превышающем по размеру 4 KiB.
- Инструмент, предназначенный для извлечения ключа (подзадача 1), должен сохранять ключ в файл encrypt.key в текущем каталоге в двоичном виде.
- Инструмент, предназначенный для подмены ключа (подзадача 2), должен считывать ключ из файла decrypt.key в текущем каталоге в двоичном виде.
Подзадача | Баллы |
---|---|
Извлечение ключа шифрования из программы encrypt | 5 |
Динамическая модификация программы decrypt с подменой ключа шифрования | 5 |
Всего | 10 |