AlphaGolang
por Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
Descripción:
AlphaGolang es una colección de scripts IDAPython para ayudar a los ingenieros inversos de malware a dominar los binarios de Go. La idea es dividir los scripts en pasos concretos, evitando así scripts monolíticos frágiles, y emulando la metodología que un analista podría seguir al abordar un binario de Go.
Los scripts se publican bajo licencia GPL (honrando el GolangLoaderAssist original de Tim Strazzere, que refactorizamos y actualizamos para python3, créditos a Tim :) ). ¡Las contribuciones son bienvenidas y alentadas!
Requisitos: IDA Pro (idealmente v7.6+) y Python3 (puaj)
Los primeros dos pasos (recreate_pclntab y function_discovery_and_renaming) funcionarán en IDA v7.5- pero los scripts más allá de eso requieren IDAv7.6+. Las versiones más nuevas son el objetivo ideal para los scripts más nuevos en adelante.
Referencia original: Charla de Mandiant Cyber Defense Summit 2021 (Video pendiente)
Metodología de Análisis de AlphaGolang
-
Paso 0: Regla YARA para identificar binarios Go (PE/ELF/MachO)
- identify_go_binaries.yara
- Verificación simple de cabecera + expresión regular para la cadena de ID de compilación de Go.
- Probablemente se podría mejorar el rango de longitud del ID de compilación.
-
Paso 1: Recrear la tabla pcln
- recreate_pclntab.py (IDA v7.5- compatible)
- Recrea la sección gopclntab a partir de heurísticas
- Mayormente útil para IDA v7.5-
-
Paso 2: Descubrir funciones recorriendo la tabla pcln y agregar nombres a todas
- function_renaming.py (IDA v7.5- compatible)
- Separado de golang loader assist
- Descubrimiento por fuerza bruta de funciones faltantes basado en la tabla pcln
- Corregí algunos problemas de limpieza de nombres de funciones de la transición a py3
- Refactorizado para agregar mejoras para Go v1.18 basado en Panchan de Akamai. ¡Gracias a Alex (CycleOfTheAbsurd).
-
Paso 3: Mostrar funciones generadas por el usuario
- categorize_go_folders.py (Requiere IDA v7.6+)
- Categoriza automáticamente funciones en carpetas
- Requiere IDAv7.6 y que 'mostrar carpetas' esté habilitado en la vista de funciones
- ACTUALIZACIÓN 16.05.2022: Se corrigió conflicto con la ordenación de carpetas de IDA v7.7
- Se recomienda encarecidamente revertir los metadatos de Lumina antes de ejecutar este plugin.
-
Paso 4: Corregir referencias a cadenas
- fix_string_cast.py
- Separado de golang loader assist
- Se añadió lógica para indefinir blobs de cadenas existentes antes de definir nueva cadena
- Las nuevas comprobaciones de cordura lo hacen mucho más efectivo
-
- extract_types.py
- Comenta los argumentos de todas las llamadas a
newobject, makechan, etc.
- Aplica el tipo C correcto a estos objetos y los renombra
- Obtiene el nombre legible por humanos y lo añade como comentario
Correcciones pendientes y espacio para contribuciones:
- fix_string_cast.py
- Todavía necesita refactorización + mejores heurísticas de carga de cadenas
- Puede provocar bloqueo en binarios masivos.
- Faltan algunos mecanismos de carga indirecta de cadenas.
- extract_types.py
- Funciona actualmente en archivos PE y Mach-O buscando los nombres de sección hardcodeados
.rdata o __rodata.
- Se necesita una verificación/implementación adecuada para tamaños codificados en varint
Próximos pasos:
- Rastrear referencias a cadenas por funciones generadas por el usuario
- Generar automáticamente firmas YARA basadas en funciones generadas por el usuario
- Generar salida de pseudocódigo Hex-Rays para funciones generadas por el usuario
- Establecer automáticamente puntos de interrupción para análisis dinámico de argumentos
- ???
Créditos para:
- Tim Strazzere por publicar el golang_loader_assist original
- Milan Bohacek (Avast Software s.r.o.) por su invaluable ayuda para descifrar la API de idatree.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT) por el paso 5.
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (alias CycleOfTheAbsurd) de ESET por refactorizar el Paso 2 para soporte de Go v1.18.