AlphaGolang
par Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
Description :
AlphaGolang est une collection de scripts IDAPython pour aider les ingénieurs en rétro-ingénierie de malwares à maîtriser les binaires Go. L'idée est de diviser les scripts en étapes concrètes, évitant ainsi les scripts monolithiques fragiles, et imitant la méthodologie qu'un analyste pourrait suivre lorsqu'il aborde un binaire Go.
Les scripts sont publiés sous licence GPL (en hommage au GolangLoaderAssist original de Tim Strazzere que nous avons refactoré et mis à jour pour python3, un grand merci à Tim :) ). Les contributions sont les bienvenues et encouragées !
Prérequis : IDA Pro (idéalement v7.6+) et Python3 (beurk)
Les deux premières étapes (recreate_pclntab et function_discovery_and_renaming) fonctionneront sur IDA v7.5- mais les scripts au-delà nécessitent IDAv7.6+. Les versions plus récentes sont la cible idéale pour les nouveaux scripts à l'avenir.
Référence originale : Présentation au Mandiant Cyber Defense Summit 2021 (Vidéo en attente)
Méthodologie d'analyse AlphaGolang
-
Étape 0 : Règle YARA pour identifier les binaires Go (PE/ELF/MachO)
- identify_go_binaries.yara
- Vérification simple d'en-tête + regex pour la chaîne Go build ID.
- On pourrait probablement améliorer la plage de longueur du build ID.
-
Étape 1 : Recréer la table pcln
- recreate_pclntab.py (compatible IDA v7.5-)
- Recrée la section gopclntab à partir d'heuristiques
- Principalement utile pour IDA v7.5-
-
Étape 2 : Découvrir les fonctions en parcourant la table pcln et ajouter des noms à toutes
- function_renaming.py (compatible IDA v7.5-)
- Extrait de golang loader assist
- Découverte par force brute des fonctions manquantes basée sur la table pcln
- Correction de certains problèmes de nettoyage des noms de fonctions lors de la transition py3
- Refactoré pour ajouter des améliorations pour Go v1.18 basées sur Panchan d'Akamai ! Merci à Alex (CycleOfTheAbsurd).
-
Étape 3 : Exposer les fonctions générées par l'utilisateur
- categorize_go_folders.py (Nécessite IDA v7.6+)
- Catégorise automatiquement les fonctions dans des dossiers
- Nécessite IDAv7.6 + l'option 'show folders' activée dans la vue des fonctions
- MISE À JOUR 16.05.2022 : Correction d'un conflit avec le tri des dossiers d'IDA v7.7
- Recommandation forte : annuler les métadonnées de Lumina avant d'exécuter ce plugin.
-
Étape 4 : Corriger les références de chaînes
- fix_string_cast.py
- Extrait de golang loader assist
- Ajout d'une logique pour annuler la définition des blobs de chaînes existants avant de définir une nouvelle chaîne
- De nouvelles vérifications de cohérence le rendent beaucoup plus efficace
-
- extract_types.py
- Commente les arguments de tous les appels à
newobject, makechan, etc.
- Applique le type C correct à ces objets et les renomme
- Obtient le nom lisible par l'humain et l'ajoute en tant que commentaire
Corrections en attente et possibilités de contributions :
- fix_string_cast.py
- Nécessite encore une refactorisation + de meilleures heuristiques de chargement de chaînes
- Peut provoquer un blocage dans les binaires massifs.
- Certains mécanismes de chargement indirect de chaînes ne sont pas pris en compte.
- extract_types.py
- Fonctionne actuellement sur les fichiers PE et Mach-O en recherchant les noms de sections codés en dur
.rdata ou __rodata.
- Une vérification / implémentation appropriée pour les tailles encodées en varint est nécessaire
Prochaines étapes :
- Suivre les références de chaînes par les fonctions générées par l'utilisateur
- Générer automatiquement des signatures YARA basées sur les fonctions générées par l'utilisateur
- Générer une sortie de pseudocode hex-rays pour les fonctions générées par l'utilisateur
- Définir automatiquement des points d'arrêt pour l'analyse dynamique des arguments
- ???
Remerciements à :
- Tim Strazzere pour avoir publié le golang_loader_assist original
- Milan Bohacek (Avast Software s.r.o.) pour son aide précieuse pour comprendre l'API idatree.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT) pour l'étape 5.
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (alias CycleOfTheAbsurd) d'ESET pour la refactorisation de l'étape 2 pour la prise en charge de Go v1.18.