Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ghostrings — Ghidra-Skripte zum Wiederherstellen von String-Definitionen in Go-Binärdateien | Kitploit
Tools/GitHubGitHub/nccgroup/ghostrings
Code-AnalyseReverse EngineeringBinäranalyse
GitHubnccgroup/ghostrings

ghostrings

Ghidra-Skripte zum Wiederherstellen von String-Definitionen in Go-Binärdateien

Repository anzeigenWebseite
1389vor 8 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Ghostrings

Skripte zum Wiederherstellen von String-Definitionen in Go-Binaries mit P-Code-Analyse. Getestet mit x86, x86-64, ARM und ARM64.

Skripte

Golang

Diese finden Sie in der Kategorie Golang im Skript-Manager.

  • GoDynamicStrings.java
    • Analysiert P-Code, um auf dem Stack erstellte String-Strukturen zu finden. Verwendet die Analyse im Stil „register“ auf niedrigerer Ebene.
  • GoFuncCallStrings.java
    • Analysiert P-Code, um String-Strukturen zu finden, die direkt über Register an Funktionsaufrufe übergeben werden, ohne auf den Stack geschrieben zu werden. Verwendet die Analyse im Stil „normalize“ mit Ghidras neuer integrierter Golang-Unterstützung (siehe Ghidra-Versionshinweise für unterstützte Golang-Versionen).
  • GoStaticStrings.java
    • Findet Go-String-Strukturen, die statisch im Nur-Lese-Speicher abgelegt sind.
  • GoKnownStrings.java
    • Sucht nach standardmäßigen eindeutigen Strings und definiert sie. Die String-Daten werden aus data/known_strings.json geladen.
  • GoStringFiller.java
    • Füllt nach der ersten Analyse Lücken in go.string.* auf, basierend auf der aufsteigenden Längenreihenfolge der String-Daten.

Es gibt außerdem ein paar spezielle Varianten des Skripts zur dynamischen String-Analyse:

  • GoDynamicStringsSingle.java
    • Führt die gleiche Analyse wie GoDynamicStrings.java durch, verwendet jedoch einen einzelnen Dekompilierungsprozess. Verwenden Sie dies, wenn die Analyse einer Binärdatei dazu führt, dass die parallelen Dekompilierungsprozesse den Systemspeicher erschöpfen.
  • GoDynamicStringsHigh.java
    • Experimentell, verwendet P-Code-Ausgabe der Analyse im Stil „normalize“ auf höherer Ebene. Hängt derzeit von einem Hack ab, der die Tote-Code-Eliminierung im Dekompilierer deaktiviert (siehe https://research.nccgroup.com/2022/05/20/earlyremoval-in-the-conservatory-with-the-wrench/). Dieser Hack funktioniert in Ghidra 10.2 nicht.

P-Code

Dieses finden Sie in der Kategorie PCode im Skript-Manager.

  • PrintHighPCode.java
    • Gibt die High-P-Code-Ausgabe für die aktuell ausgewählte Funktion auf der Konsole aus, mit einer Auswahl für den zu verwendenden Vereinfachungsstil des Dekompilierers. Hauptsächlich für die Entwicklung von P-Code-Analyse-Skripten gedacht.

Ablauf der String-Wiederherstellung

Hier ist der allgemeine Ablauf für die Verwendung dieser Skripte, um String-Definitionen in einer Go-Binary wiederherzustellen:

  1. Entfernen Sie alle falschen oder automatisch definierten Strings im Nur-Lese-Datenspeicherblock.
    • Aktivieren Sie im Fenster „Defined Strings“ die Spalte „Mem Block“ und filtern Sie nach Speicherblock, um alle Strings in .rodata, .rdata oder __rodata auszuwählen. Klicken Sie dann in der Code-Listing mit der rechten Maustaste und wählen Sie „Clear Code Bytes“.
  2. (Optional) Führen Sie GoKnownStrings.java aus, um einige Standard-Strings zu erkennen.
  3. Führen Sie GoStaticStrings.java aus.
  4. Führen Sie GoFuncCallStrings.java aus (falls die Golang-Binärversion von Ghidras integrierten Golang-Funktionen unterstützt wird).
  5. Führen Sie GoDynamicStrings.java aus.
  6. Führen Sie GoStringFiller.java aus.
    • Wenn eine Verletzung der aufsteigenden Längenreihenfolge der String-Daten erkannt wird, entfernen Sie alle falsch-positiven String-Definitionen in diesem Bereich und führen Sie das Skript erneut aus. Es gibt eine Option, dies automatisch zu tun.
    • Wenn die Binary gestrippt ist, lokalisieren Sie den Bereich mit Ein-Byte-Strings, die vom Skript zur dynamischen String-Analyse gefunden wurden. Stellen Sie sicher, dass es sich um den Anfang der gruppierten, nicht nullterminierten Strings handelt (weitere Strings sollten danach mit aufsteigender Länge definiert werden). Erstellen Sie das Label go.string.* beim ersten Ein-Byte-String.

Einrichtung

Installation

In Ghidra:

  1. File -> Install Extensions -> Add extension
  2. Wählen Sie die Extension-ZIP-Datei aus.

Entwicklung

Für Eclipse mit dem GhidraDev-Plugin:

  1. Repository klonen
  2. File -> Import -> Projects from Folder or Archive
  3. Repository-Verzeichnis auswählen
  4. GhidraDev -> Link Ghidra...
  5. Importiertes Projekt auswählen

Erstellen

Mit Eclipse erstellen:

  • GhidraDev -> Export -> Ghidra Module Extension...

Direkt mit Gradle erstellen:

root@kitploit:~
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>

Hintergrund

Ein bekanntes Problem beim Reverse Engineering von Go-Programmen ist, dass das Fehlen von Nullterminatoren in Go-Strings die Wiederherstellung von String-Definitionen aus kompilierten Binaries erschwert. Viele der konstanten String-Werte eines Go-Programms werden zusammen in einem einzigen großen Block im kompilierten Build gespeichert, ohne dass in den String-Daten Terminatorzeichen eingebaut sind, die markieren, wo ein String endet und ein anderer beginnt. Selbst ein einfaches Programm, das nur „Hello world!“ ausgibt, enthält über 1.500 Strings, die mit dem Go-Laufzeitsystem und anderen Standardbibliotheken zusammenhängen. Dies kann dazu führen, dass typische ASCII-String-Erkennungsimplementierungen, wie die von Ghidra, falsch-positive String-Definitionen erzeugen, die zehntausende von Zeichen lang sind.

Anstelle von nullterminierten Strings verwendet Go eine String-Struktur, die aus einem Zeiger und einem Längenwert besteht. Viele dieser String-Strukturen werden zur Laufzeit auf dem Stack des Programms erstellt, daher erfordert die Wiederherstellung einzelner String-Startpositionen und Längenwerte die Analyse des kompilierten Maschinencodes. Es gibt einige vorhandene Skripte, die diese Analyse durchführen, indem sie nach bestimmten Mustern von x86-64-Anweisungen suchen, aber sie übersehen Strukturen, die mit nicht behandelten Anweisungsvarianten erstellt wurden, die letztlich denselben Effekt auf den Stack haben, und sie sind außerdem auf eine bestimmte ISA beschränkt.

Ghostrings umgeht beide Probleme, indem es mit den vereinfachten, architekturunabhängigen P-Code-Operationen arbeitet, die von Ghidras Dekompilierer-Analyse erzeugt werden.

Release-Informationen

Copyright 2022 NCC Group. Veröffentlicht unter der GPLv3-Lizenz (siehe LICENSE).

Hauptautor des Projekts: James Chambers [email protected]

Tool herunterladen
  • Prüfen Sie auf verbleibende Lücken in go.string.* und definieren Sie alle Strings mit offensichtlichen Start- und Endpunkten.
    • Um GoStringFiller.java optimal zu nutzen, identifizieren Sie, wo sich die String-Längen in undefinierten String-Daten ändern, und definieren Sie die Strings, die dieser Grenze am nächsten liegen. Führen Sie dann GoStringFiller.java erneut aus, um Stellen automatisch aufzufüllen, an denen die Länge der verbleibenden undefinierten Strings korrekt bestimmt werden kann.
  • (Optional) Führen Sie das integrierte ASCII-String-Analysewerkzeug von Ghidra erneut aus.
    • Deaktivieren Sie das Überschreiben vorhandener Strings. Führen Sie es mit und dann ohne die Anforderung eines Nullterminators aus.