Руководство по реверсированию общих объектов с помощью Ghidra
Я рад объявить, что вернусь в этом году на конференцию Black Hat USA 2023 в Лас-Вегасе. Как и в случае с уроками предыдущих лет, Руководство по реверсированию с помощью Ghidra направлено на то, чтобы дать учащимся практические знания о том, как использовать Ghidra для целого ряда реальных приложений. В этом посте я приведу образец одного из новых учений, вводимых на 2023 год.
В этом упражнении учащимся предлагается определить запутанную функциональность в скомпилированной библиотеке в рамках гипотетического сценария. Двоичный файл имеет большую сложность, и предлагаемое решение состоит в том, чтобы использовать поддержку отладчика Ghidra для выполнения динамического анализа в целях экономии времени. Это упражнение развивает навыки отладки в общем модуле (может быть сложнее, чем кажется), а также понимание запутанной функциональности.
Для этой статьи давайте рассмотрим гипотетический сценарий инженера по продукту, работающего над устройством ACME Instant Tunnel AR следующего поколения. Клиенты сообщают о неадекватных результатах в полевых условиях, а некоторые пользователи получают противоречивые результаты. Руководство пообещало им поддержку нового детектора птиц Globex с искусственным интеллектом. Globex с радостью предоставит лицензию на эту технологию, но они хотят сохранить контроль над своей интеллектуальной собственностью и будут поставлять ее только в виде предварительно скомпилированной библиотеки. Однако во время тестирования в песочнице модуль выполняет поиск DNS для домена «secur3.us», который не отображается в дампе двоичного файла.
Отсюда задача состоит в том, чтобы определить ссылку на этот домен и то, как он используется. Уже было определено, что поиск DNS запускается при вызове `void initialize_bdu(char *devname)`, где для имени dev задано значение /dev/null, а не ожидаемое устройство TTY.
Открытие этой функции в Ghidra показывает следующее:
Хотя мы, безусловно, могли бы распутать этот беспорядок с помощью статического анализа, отладчик дает возможность сэкономить много времени, позволяя программе выполнять запутанные функции во время проверки.
Общий процесс для этого выглядит следующим образом:
- Создайте приложение-оболочку для вызова `initialize_bdu()`.
- Загрузите оболочку в Ghidra и выполните автоанализ.
- Запустите приложение-оболочку в отладчике
Обязательно укажите среду, в которой может находиться общая библиотека. - Запускайте программу до тех пор, пока она не вызовет libglobex.so.
- Сопоставьте модуль (libglobex.so) с динамическим процессом.
Это позволяет Ghidra вычислять правильные адреса в libglobex.so - Установите точку останова в анализируемой функции `initialize_bdu()`.
- Пошаговое выполнение программы во время просмотра памяти для «secur3.us»
Самым трудным шагом в этом процессе для меня было правильное сопоставление между libglobex.so и запущенным экземпляром приложения-оболочки. Похоже, Ghidra иногда попадает в состояние, когда динамический диапазон не обновляется после загрузки модуля, если вы пытаетесь взаимодействовать с модулем слишком рано в жизненном цикле процесса. Перед попыткой сопоставления убедитесь, что модуль показывает ненулевой базовый адрес, как показано на снимке экрана ниже. После установки сопоставления оно должно оставаться для будущих сеансов отладки.
Пример файла, чтобы попробовать это, находится здесь на случай, если кто-то захочет попробовать это дома: https://secur3.us/libglobex.so
Простую оболочку можно создать, скомпилировав:
// Compile with: gcc -o wrapper_app main.c -L. -lglobex -lcurl -ldl -lcrypto #include <stdio.h> extern void initialize_bdu(char *devname); int main() { printf("Calling suspect function...\n"); initialize_bdu("/dev/null"); return 0; }
И для примера, на что обращать внимание при поиске в памяти:
После обнаружения данных вы можете путешествовать во времени по записанной трассе, чтобы выяснить, как они туда попали. Вы также можете сбросить память в этот момент и проверить ее на наличие других интересных строк. Если есть интерес к продолжению этой публикации, пожалуйста, прокомментируйте ниже или свяжитесь со мной в Твиттере (@CraigTweets) с вопросами о том, как зайти так далеко или куда двигаться дальше!
Надеюсь, вам понравилось читать, и если да, надеюсь, вы рассмотрите возможность присоединиться ко мне этим летом в Вегасе для Руководства по реверсированию с Ghidra на Black Hat USA 2023 (или понедельник/вторник). В классе вы узнаете все, что вам нужно знать, чтобы начать использовать Ghidra для обратного проектирования программ, и пройдете практические занятия, иллюстрирующие различные профессиональные варианты использования этого мощного программного пакета для реверсирования.