Динамическое инструментирование бинарного кода

Применение системы динамического инструментирования Pin. Выявление поведенческих сигнатур в бинарном коде. Модификация поведения бинарного кода.

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

Задание посвящено ознакомлению с системой динамического инструментирования бинарного кода Pin. Следующее описание гипотетической ситуации служит неформальной постановкой задачи.

В наши руки попала «сырая» версия крипто-локера, в котором ещё не реализован функционал по обходу файловой системы и вымоганию денег, но уже реализовано само шифрование. Особая удача заключается в том, что среди полученных материалов было несколько версий программы шифрования encrypt и несколько версий программы расшифровки decrypt. Наши специалисты провели предварительный анализ полученных образцов и выяснили следующее.

  1. Все бинарные модули собраны статически и из них не удалены символы.
  2. Судя по всему, все программы используют алгоритм симметричного шифрования Blowfish (термин «симметричное шифрование» означает, что для шифрования и дешифрования применяется один и тот же ключ) в реализации библиотеки libcrypto из пакета OpenSSL. В символах мы видим функцию BF_set_key, которая используется для задания ключа шифрования (ключом при этом считается буфер, задаваемый параметрами data и len, а не внутренняя структура библиотеки key).
  3. Разные версии encrypt и разные версии decrypt работают с разными ключами. Мы не смогли найти пару encrypt-decrypt, которая бы работала с одним и тем же ключом.
  4. Разные версии программ также отличаются адресами символов, но сами символы в них одинаковые.

Мы просим вас реализовать два Pin-инструмента: первый, который позволит в динамике извлечь используемый ключ из одной из версий программы encrypt, и второй, который заменит используемый ключ в программе decrypt на заданный. Таким образом мы сможем получить все ключи шифрования и применить их для расшифровки.

Для работы вам передаётся одна версия encrypt, одна версия decrypt (с разными используемыми ключами), а также один файл, зашифрованный вашей версией encrypt, с названием encrypted.sample.

Подготовка к выполнению задания

Выполните следующую последовательность действий для подготовки к выполнению задания.

  1. Разверните образ виртуальной машины и запустите его в ПО Oracle VirtualBox. Обратите внимание, что используется та же самая виртуальная машина, что и в первом задании. Повторно скачивать образ не требуется.
  2. Войдите в гостевую Linux-систему с именем пользователя student без пароля. Из-за лицензионных ограничений Pin мы не можем включить развёрнутый архив в образ, его придётся скачать отдельно:

    $ wget http://software.intel.com/sites/landingpage/pintool/downloads/pin-3.4-97438-gf90d1f746-gcc-linux.tar.gz
    $ tar xf pin-3.4-97438-gf90d1f746-gcc-linux.tar.gz

  3. Изнутри виртуальной машины скачайте архив с персональным вариантом при помощи утилиты wget и распакуйте его, например:

    $ wget https://caiscourse.ru/assets/assignment_variants/73DF16B2.zip
    $ unzip 73DF16B2.zip
    $ chmod +x encrypt decrypt

Подзадачи

Далее формально описаны подзадачи, которые необходимо решить. Подзадачи решаются в прямом порядке: для решения второй сначала потребуется решить первую.

Подзадача 1: извлечение ключа шифрования из программы encrypt

В рамках данной подзадачи необходимо реализовать Pin-инструмент, позволяющий во время работы программы encrypt получить используемый ключ шифрования (в виде набора байтов) и сохранить его в двоичном виде в файл encrypt.key в текущем каталоге.

Ваш инструмент должен работать с любой версией программы encrypt. Вы можете быть уверены в том, что в случае успешной работы программа encrypt ровно один раз вызывает функцию BF_set_key. Адрес, соответствующий символу BF_set_key — не константа, эта функция размещается по разным адресам в разных версиях программы encrypt.

Чтобы подзадача считалась успешно решённой, вам необходимо сдать в тестирующую систему файл encrypt.key, содержащий извлечённый ключ, и исходный код разработанного инструмента. Возможна выборочная очная защита сданного кода в случае интересных применённых решений или подозрения на плагиат.

Подзадача 2: динамическая модификация программы decrypt с подменой ключа шифрования

В рамках данной подзадачи необходимо реализовать Pin-инструмент, позволяющий во время работы программы decrypt подменить используемый ей ключ шифрования на расположенный в текущем каталоге в файле decrypt.key.

Ваш инструмент должен работать с любой версией программы decrypt. Вы можете быть уверены в том, что в случае успешной работы программа decrypt ровно один раз вызывает функцию BF_set_key. Адрес, соответствующий символу BF_set_key — не константа, эта функция размещается по разным адресам в разных версиях программы decrypt.

Чтобы подзадача считалась успешно решённой, вам необходимо сдать в тестирующую систему файл, полученный в результате расшифровки файла encrypted.sample, и исходный код разработанного инструмента. Возможна выборочная очная защита сданного кода в случае интересных применённых решений или подозрения на плагиат.

Требования к реализации Pin-инструменов

Далее перечислены требования к реализуемым в рамках решения подзадач задания инструментам.

  1. Инструменты сдаются в виде исходного кода.
  2. Инструмент должен быть реализован полностью в одном .cpp-файле, не превышающем по размеру 4 KiB.
  3. Инструмент, предназначенный для извлечения ключа (подзадача 1), должен сохранять ключ в файл encrypt.key в текущем каталоге в двоичном виде.
  4. Инструмент, предназначенный для подмены ключа (подзадача 2), должен считывать ключ из файла decrypt.key в текущем каталоге в двоичном виде.
Система оценивания
Подзадача Баллы
Извлечение ключа шифрования из программы encrypt 5
Динамическая модификация программы decrypt с подменой ключа шифрования 5
Всего 10