
Script Ghidra per il recupero delle definizioni di stringhe nei binari Go
Script per recuperare le definizioni di stringhe nei binari Go con analisi P-Code. Testato con x86, x86-64, ARM e ARM64.
Questi si trovano nella categoria Golang dello Script Manager.
GoDynamicStrings.java
GoFuncCallStrings.java
GoStaticStrings.java
GoKnownStrings.java
data/known_strings.json.GoStringFiller.java
go.string.* dopo l'analisi iniziale, in base all'ordine crescente di lunghezza dei dati delle stringhe.Ci sono anche un paio di varianti speciali dello script di analisi delle stringhe dinamiche:
GoDynamicStringsSingle.java
GoDynamicStrings.java, ma utilizza un singolo processo del decompilatore. Usalo se l'analisi di un binario fa sì che i processi paralleli del decompilatore esauriscano la memoria di sistema.GoDynamicStringsHigh.java
Questo si trova nella categoria PCode dello Script Manager.
PrintHighPCode.java
Ecco il flusso generale per usare questi script per recuperare le definizioni di stringhe in un binario Go:
.rodata, .rdata o __rodata. Quindi fai clic con il tasto destro nel listing del codice e scegli "Clear Code Bytes".GoKnownStrings.java per rilevare alcune stringhe standard.GoStaticStrings.java.GoFuncCallStrings.java (se la versione del binario Golang è supportata dalle funzionalità Golang integrate di Ghidra).GoDynamicStrings.java.GoStringFiller.java.
go.string.* sulla prima stringa di un byte.In Ghidra:
Per Eclipse con il plugin GhidraDev:
Compila con Eclipse:
Compila direttamente con Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>
Un problema noto nel reverse engineering dei programmi Go è che la mancanza di terminatori null nelle stringhe Go rende difficile il recupero delle definizioni di stringhe dai binari compilati. Molti valori di stringa costanti di un programma Go sono memorizzati insieme in un unico grande blob nella build compilata, senza caratteri terminatore integrati nei dati delle stringhe che indichino dove finisce una stringa e ne inizia un'altra. Anche un semplice programma che stampa solo "Hello world!" contiene oltre 1.500 stringhe relative al sistema runtime di Go e ad altre librerie standard. Questo può portare le tipiche implementazioni di rilevamento delle stringhe ASCII, come quella fornita da Ghidra, a creare definizioni di stringhe false positive lunghe decine di migliaia di caratteri.
Invece di stringhe terminate da null, Go usa una struttura di stringa composta da un puntatore e un valore di lunghezza. Molte di queste strutture di stringa vengono create sullo stack del programma in fase di esecuzione, quindi recuperare le singole posizioni di inizio delle stringhe e i valori di lunghezza richiede l'analisi del codice macchina compilato. Esistono alcuni script che eseguono questa analisi controllando determinati pattern di istruzioni x86-64, ma non rilevano le strutture create con variazioni di istruzioni non gestite che alla fine hanno lo stesso effetto sullo stack, e sono inoltre limitati a una specifica ISA.
Ghostrings evita entrambi questi problemi lavorando con le operazioni P-Code semplificate e indipendenti dall'architettura prodotte dall'analisi del decompilatore di Ghidra.
Copyright 2022 NCC Group. Rilasciato sotto licenza GPLv3 (vedi LICENSE).
Autore principale del progetto: James Chambers [email protected]
go.string.* e definisci eventuali stringhe con punti di inizio e fine evidenti.
GoStringFiller.java, individua dove le lunghezze delle stringhe stanno cambiando nei dati di stringhe non definiti e definisci le stringhe più vicine a quel confine. Quindi riesegui GoStringFiller.java per riempire automaticamente i punti in cui può determinare correttamente la lunghezza delle restanti stringhe non definite.