Это короткий и краткий блог, чтобы поделиться с вами, как и было обещано, сценарием IDAPython, используемым для расшифровки строк в образце Poison Ivy, который обсуждался в нашем предыдущем сообщении в блоге [1].

Прежде чем мы сможем начать расшифровку строк, нам сначала нужно найти функцию декодирования строк. Просматривая код Poison Ivy, мы видим функцию, которая принимает три параметра в качестве входных данных; один из них является ключом, а другой — смещением на несколько байтов.

Если мы посмотрим на внешние ссылки в IDA для этой функции, мы увидим довольно много ссылок.

Глядя на некоторые из этих ссылок, мы видим, что один и тот же тип аргументов передается функции каждый раз, когда она вызывается. Более того, заглянув внутрь функции, можно увидеть что-то похожее на цикл расшифровки.

Это все больше и больше похоже на нашу функцию расшифровки строк.

Чтобы убедиться, мы можем проверить с помощью нашего отладчика и точки останова сразу после цикла. Проверяя буфер, который заполняется в цикле — в этом случае указатель на начало буфера находится в «rbx» — мы можем увидеть расшифрованную строку.

Функция расшифровки строк использует значение ключа двойного слова в «r8d» для расшифровки буфера, предоставленного в «rdx». Цикл перебирает каждый байт в ключе, объединяя наименее значащий байт с байтом в предоставленном буфере.

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

С помощью сценария IDAPython [2] теперь мы можем видеть все расшифрованные строки и добавлять комментарий рядом с каждым зашифрованным значением. Итак, мы получаем что-то вроде следующего:

Глядя на некоторые из расшифрованных строк, мы видим, что он ищет такие каналы, как \\.\RegMon, \\.\FileMon, \\.\ProcmonDebugLogger и \\.\NTICE.

Вы, наверное, догадались, для чего предназначены первые три. Последний предназначен для SoftICE, отладчика ядра, который когда-то был довольно популярен.

Мы также можем видеть такие строки, как Wireshark-is-running-{9CA78EEA-EA4D-4490–9240-FC01FCEF464B}, WinDbgFrameClass и ACPUASM (Ollydbg обнаружение имени оконного класса). Все это для проверки инструментов отладки и анализа, которые будут работать во время работы образца. Если они есть, выборка завершается. Вы можете обойти любую из этих проверок, исправив строки в памяти, чтобы проверки не удались.

Существует также строка IsDebuggerPresent, проверку которой можно обойти, либо исправив возвращаемое значение из API, либо, если вы используете Ollydbg, с помощью подключаемого модуля против отладки, такого как StrongOD.

Удачного реверса!

использованная литература

[1] https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/august/analysing-a-recent-poison-ivy-sample/

[2] https://github.com/nccgroup/Cyber-Defence/blob/master/Scripts/poison_ivy_string_decrypt.py

Дата публикации: 7 сентября 2017 г.

Первоначально опубликовано на www.nccgroup.trust.