AlphaGolang
от Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
Описание:
AlphaGolang — это набор IDAPython-скриптов, помогающих специалистам по реверс-инжинирингу вредоносного ПО осваивать бинарные файлы Go. Идея заключается в разбиении скриптов на конкретные шаги, что позволяет избежать хрупких монолитных скриптов и имитирует методологию, которую аналитик может применить при работе с Go-бинарником.
Скрипты выпускаются под лицензией GPL (в честь оригинального GolangLoaderAssist от Tim Strazzere, который мы переработали и обновили для Python3, спасибо Tim :) ). Вклад приветствуется и поощряется!
Требования: IDA Pro (желательно v7.6+) и Python3 (фу)
Первые два шага (recreate_pclntab и function_discovery_and_renaming) будут работать на IDA v7.5-, но скрипты, идущие дальше, требуют IDAv7.6+. Новые версии — идеальная цель для будущих скриптов.
Оригинальная ссылка: Доклад на Mandiant Cyber Defense Summit 2021 (видео ожидается)
AlphaGolang Методология анализа
-
Шаг 0: YARA-правило для идентификации Go-бинарников (PE/ELF/MachO)
- identify_go_binaries.yara
- Простая проверка заголовка + регулярное выражение для строки Go build ID.
- Возможно, стоит улучшить диапазон длины build ID.
-
Шаг 1: Восстановление таблицы pcln
- recreate_pclntab.py (совместимо с IDA v7.5-)
- Восстанавливает секцию gopclntab на основе эвристик
- В основном полезно для IDA v7.5-
-
Шаг 2: Обнаружение функций путём обхода таблицы pcln и присвоение имён всем
- function_renaming.py (совместимо с IDA v7.5-)
- Выделен из golang loader assist
- Перебором находит отсутствующие функции на основе таблицы pcln
- Исправлены некоторые проблемы очистки имён функций при переходе на Python3
- Переработан для улучшения поддержки Go v1.18 на основе Panchan от Akamai. Спасибо Alex (CycleOfTheAbsurd).
-
Шаг 3: Выявление пользовательских функций
- categorize_go_folders.py (требуется IDA v7.6+)
- Автоматически распределяет функции по папкам
- Требует IDAv7.6+ и включённого режима 'show folders' в представлении функций
- ОБНОВЛЕНИЕ 16.05.2022: Исправлен конфликт с сортировкой папок в IDA v7.7
- Настоятельно рекомендуется откатить метаданные из Lumina перед запуском этого плагина.
-
Шаг 4: Исправление строковых ссылок
- fix_string_cast.py
- Выделен из golang loader assist
- Добавлена логика для удаления ранее существовавших строковых блоков перед определением новой строки
- Новые проверки корректности делают его гораздо эффективнее
-
Шаг 5: Извлечение информации о типах (от Ivan Kwiatkowski)
- extract_types.py
- Комментирует аргументы всех вызовов
newobject, makechan и т.д.
- Применяет правильный C-тип к этим объектам и переименовывает их
- Получает читаемое имя и добавляет его как комментарий
Ожидающие исправления и возможности для вклада:
- fix_string_cast.py
- Всё ещё требует рефакторинга + улучшенных эвристик загрузки строк
- Может привести к зависанию в больших бинарниках.
- Отсутствуют некоторые механизмы косвенной загрузки строк.
- extract_types.py
- В настоящее время работает с PE и Mach-O файлами, ища жёстко заданные имена секций
.rdata или __rodata.
- Требуется правильная реализация для размеров, закодированных с помощью varint
Следующие шаги:
- Отслеживание строковых ссылок от пользовательских функций
- Автоматическое создание YARA-сигнатур на основе пользовательских функций
- Генерация вывода Hex-Rays псевдокода для пользовательских функций
- Автоматическая установка точек останова для динамического анализа аргументов
- ???
Благодарности:
- Tim Strazzere за выпуск оригинального golang_loader_assist
- Milan Bohacek (Avast Software s.r.o.) за неоценимую помощь в разборе API idatree.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT) за шаг 5.
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (он же CycleOfTheAbsurd) из ESET за рефакторинг Шага 2 для поддержки Go v1.18.