AlphaGolang
di Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
Descrizione:
AlphaGolang è una raccolta di script IDAPython per aiutare i reverse engineer di malware a padroneggiare i binari Go. L'idea è di suddividere gli script in passaggi concreti, evitando così script monolitici fragili, e imitando la metodologia che un analista potrebbe seguire nell'affrontare un binario Go.
Gli script sono rilasciati sotto licenza GPL (in onore del GolangLoaderAssist originale di Tim Strazzere che abbiamo rifattorizzato e aggiornato per python3, grazie a Tim :) ). I contributi sono benvenuti e incoraggiati!
Requisiti: IDA Pro (idealmente v7.6+) e Python3 (ew)
I primi due passi (recreate_pclntab e function_discovery_and_renaming) funzioneranno su IDA v7.5-, ma gli script successivi richiedono IDAv7.6+. Le versioni più recenti sono il target ideale per i nuovi script in futuro.
Riferimento originale: Presentazione al Mandiant Cyber Defense Summit 2021 (Video in attesa)
Metodologia di Analisi di AlphaGolang
-
Step 0: Regola YARA per identificare binari Go (PE/ELF/MachO)
- identify_go_binaries.yara
- Controllo semplice dell'header + regex per la stringa Go build ID.
- Probabilmente si potrebbe migliorare l'intervallo di lunghezza del build ID.
-
Step 1: Ricreare la tabella pcln
- recreate_pclntab.py (compatibile con IDA v7.5-)
- Ricrea la sezione gopclntab tramite euristiche
- Utile principalmente per IDA v7.5-
-
Step 2: Scoprire funzioni percorrendo la tabella pcln e aggiungere nomi a tutte
- function_renaming.py (compatibile con IDA v7.5-)
- Separato da golang loader assist
- Scopre in modo brute-force le funzioni mancanti basandosi sulla tabella pcln
- Risolti alcuni problemi di pulizia dei nomi delle funzioni dalla transizione a py3
- Rifattorizzato per aggiungere miglioramenti per Go v1.18 basati su Panchan di Akamai! Grazie ad Alex (CycleOfTheAbsurd).
-
Step 3: Portare in superficie le funzioni generate dall'utente
- categorize_go_folders.py (Richiede IDA v7.6+)
- Classifica automaticamente le funzioni in cartelle
- Richiede IDAv7.6 + l'opzione 'mostra cartelle' abilitata nella vista funzioni
- AGGIORNAMENTO 16.05.2022: Risolto conflitto con l'ordinamento cartelle di IDA v7.7
- Si consiglia vivamente di ripristinare i metadati da Lumina prima di eseguire questo plugin.
-
Step 4: Correggere i riferimenti alle stringhe
- fix_string_cast.py
- Separato da golang loader assist
- Aggiunta logica per annullare la definizione di blob di stringhe esistenti prima di definire una nuova stringa
- Nuovi controlli di validità lo rendono molto più efficace
-
- extract_types.py
- Commenta gli argomenti di tutte le chiamate a
newobject, makechan, ecc.
- Applica il tipo C corretto a questi oggetti e li rinomina
- Ottiene il nome leggibile dall'uomo e lo aggiunge come commento
Correzioni in sospeso e spazio per contributi:
- fix_string_cast.py
- Necessita ancora di refactoring + migliori euristiche per il caricamento delle stringhe
- Può portare a blocco in binari di grandi dimensioni.
- Mancano alcuni meccanismi di caricamento indiretto delle stringhe.
- extract_types.py
- Attualmente funziona su file PE e Mach-O cercando i nomi di sezione hardcoded
.rdata o __rodata.
- È necessario un controllo/implementazione adeguata per le dimensioni codificate in varint.
Prossimi passi:
- Tracciare i riferimenti alle stringhe nelle funzioni generate dall'utente
- Generare automaticamente firme YARA basate sulle funzioni generate dall'utente
- Generare output pseudocodice di Hex-Rays per le funzioni generate dall'utente
- Impostare automaticamente breakpoint per l'analisi dinamica degli argomenti
- ???
Crediti a:
- Tim Strazzere per il rilascio dell'originale golang_loader_assist
- Milan Bohacek (Avast Software s.r.o.) per il suo inestimabile aiuto nel comprendere l'API idatree.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT) per lo step 5.
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (alias CycleOfTheAbsurd) di ESET per il refactoring dello Step 2 per il supporto a Go v1.18.