AlphaGolang
von Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
Beschreibung:
AlphaGolang ist eine Sammlung von IDAPython-Skripten, die Malware-Reverse-Ingenieuren helfen, Go-Binärdateien zu meistern. Die Idee ist, die Skripte in konkrete Schritte zu unterteilen, um spröde monolithische Skripte zu vermeiden und die Methodik nachzuahmen, die ein Analyst beim Umgang mit einer Go-Binärdatei befolgen würde.
Die Skripte werden unter der GPL-Lizenz veröffentlicht (zu Ehren von Tim Strazzeres originalem GolangLoaderAssist, den wir umgestaltet und für Python3 aktualisiert haben, Props an Tim :) ). Beiträge sind willkommen und erwünscht!
Anforderungen: IDA Pro (idealerweise v7.6+) und Python3 (igitt)
Die ersten beiden Schritte (recreate_pclntab und function_discovery_and_renaming) funktionieren mit IDA v7.5-, aber Skripte darüber hinaus benötigen IDAv7.6+. Neuere Versionen sind das ideale Ziel für neuere Skripte in Zukunft.
Originalreferenz: Vortrag auf dem Mandiant Cyber Defense Summit 2021 (Video ausstehend)
AlphaGolang Analysemethodik
-
Schritt 0: YARA-Regel zur Identifizierung von Go-Binärdateien (PE/ELF/MachO)
- identify_go_binaries.yara
- Einfacher Header-Check + Regex für Go-Build-ID-String.
- Könnte den Bereich der Build-ID-Länge verbessern.
-
Schritt 1: pcln-Tabelle neu erstellen
- recreate_pclntab.py (kompatibel mit IDA v7.5-)
- Erstellt den gopclntab-Abschnitt aus Heuristiken
- Hauptsächlich nützlich für IDA v7.5-
-
Schritt 2: Funktionen durch Durchlaufen der pcln-Tabelle finden und allen Namen hinzufügen
- function_renaming.py (kompatibel mit IDA v7.5-)
- Aus golang loader assist ausgegliedert
- Erzwingt die Entdeckung fehlender Funktionen basierend auf der pcln-Tabelle
- Einige Probleme mit der Bereinigung von Funktionsnamen aus dem py3-Übergang behoben
- Umgestaltet, um Verbesserungen für Go v1.18 basierend auf Akamais Panchan hinzuzufügen! Dank an Alex (CycleOfTheAbsurd).
-
Schritt 3: Benutzergenerierte Funktionen sichtbar machen
- categorize_go_folders.py (Erfordert IDA v7.6+)
- Kategorisiert Funktionen automatisch in Ordner
- Erfordert IDAv7.6 + 'Ordner anzeigen' muss in der Funktionsansicht aktiviert sein
- UPDATE 05.16.2022: Konflikt mit IDA v7.7-Ordnersortierung behoben
- Es wird dringend empfohlen, Metadaten von Lumina zurückzusetzen, bevor dieses Plugin ausgeführt wird.
-
Schritt 4: String-Referenzen korrigieren
- fix_string_cast.py
- Aus golang loader assist ausgegliedert
- Logik hinzugefügt, um zuvor vorhandene String-Blobs zu undefinieren, bevor neue Strings definiert werden
- Neue Plausibilitätsprüfungen machen es weitaus effektiver
-
- extract_types.py
- Kommentiert die Argumente aller Aufrufe von
newobject, makechan usw.
- Wendet den korrekten C-Typ auf diese Objekte an und benennt sie um
- Ermittelt den lesbaren Namen und fügt ihn als Kommentar hinzu
Ausstehende Korrekturen und Raum für Beiträge:
- fix_string_cast.py
- Benötigt noch Umgestaltung + bessere String-Ladeheuristiken
- Kann bei massiven Binärdateien zu einem Einfrieren führen.
- Fehlende einige indirekte String-Lademechanismen.
- extract_types.py
- Funktioniert derzeit mit PE- und MachO-Dateien, indem nach den hartcodierten Abschnittsnamen
.rdata oder __rodata gesucht wird.
- Eine ordnungsgemäße Überprüfung / Implementierung für varint-kodierte Größen ist erforderlich
Nächste Schritte:
- String-Referenzen von benutzergenerierten Funktionen verfolgen
- Automatisch YARA-Signaturen basierend auf benutzergenerierten Funktionen generieren
- Hex-Rays-Pseudocode-Ausgabe für benutzergenerierte Funktionen generieren
- Automatisch Haltepunkte für dynamische Analyse von Argumenten setzen
- ???
Dank an:
- Tim Strazzere für die Veröffentlichung des originals golang_loader_assist
- Milan Bohacek (Avast Software s.r.o.) für seine unschätzbare Hilfe bei der Entschlüsselung der idatree-API.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT) für Schritt 5.
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (a.k.a. CycleOfTheAbsurd) von ESET für die Umgestaltung von Schritt 2 für Go v1.18-Unterstützung.