
IDAPython-Tool zum automatischen Erstellen von C++-virtuellen Tabellen in IDA Pro
Virtuailor ist ein IDAPython-Werkzeug zur Rekonstruktion von Vtabellen für C++-Code, der für die Intel-Architektur geschrieben wurde, sowohl für 32-Bit- als auch für 64-Bit-Code und AArch64 (Neu!). Das Werkzeug besteht aus zwei Teilen: einem statischen und einem dynamischen.
Der erste Teil, der statische, umfasst folgende Fähigkeiten:
Der zweite Teil, der dynamische, umfasst folgende Fähigkeiten:
Virtuailor unterstützt jetzt IDA-Versionen von 7.0 bis zur neuesten Version (7.5). Wenn Sie IDA-Versionen älter als 7.4 verwenden, müssen Sie zum Branch
beforeIDA-7.4wechseln. Der Master-Branch unterstützt die neueste verfügbare Version (7.5).
Main, um den gewünschten Bereich in den Variablen und hinzuzufügen:start_addr_rangeend_addr_rangeif __name__ == '__main__':
start_addr_range = idc.MinEA() # You can change the virtual calls address range
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
Optional (aber dringend empfohlen): Erstellen Sie einen Snapshot Ihrer IDB. Drücken Sie einfach Strg+Umschalt+T und erstellen Sie einen Snapshot.
Drücken Sie File->Run script... und navigieren Sie zum Virtuailor-Ordner, wählen Sie Main.py aus. Das folgende GIF bietet eine verständlichere visuelle Erklärung.

Die GUI bietet Ihnen nun die Möglichkeit, einen Zielbereich auszuwählen. Falls Sie die gesamte Binärdatei bearbeiten möchten, drücken Sie einfach OK mit den Standardwerten für Start- und Endadresse.
Anschließend werden die Haltepunkte in Ihrem Code platziert. Sie müssen nur noch Ihren Code mit dem IDA-Debugger ausführen, die gewünschten Aktionen durchführen und beobachten, wie die Vtabellen erstellt werden! Für AArch64 können Sie einen entfernten GDB-Server einrichten und mit dem IDA-Debugger debuggen.
Falls Sie die Haltepunkte nicht mehr benötigen, gehen Sie zur Haltepunktliste in IDA und löschen Sie die gewünschten Haltepunkte.
Es ist mir auch sehr wichtig anzumerken, dass dies die zweite Version des Werkzeugs mit Unterstützung für 32-Bit, 64-Bit und AArch64 ist. In einigen Fällen werden vermutlich eine geringe Anzahl von Haltepunkten übersehen. Bitte eröffnen Sie in solchen Fällen ein Issue und kontaktieren Sie mich, damit ich den Code verbessern und zur Behebung beitragen kann. Vielen Dank im Voraus!
Die Strukturen, die Virtuailor aus der bei virtuellen Aufrufen verwendeten Vtable erstellt, die getroffen wurden. Die Vtable-Funktionen werden basierend auf dem relevanten Register, das im BP-Opcode verwendet wurde, aus dem Speicher extrahiert.
Da ich eine Korrelation zwischen der Struktur in IDA und den Vtabellen im Datenabschnitt herstellen wollte, ändert der BP den Vtable-Adressnamen im Datenabschnitt in den Namen der Struktur. Wie im folgenden Bild zu sehen:

Auch die Namen der virtuellen Funktionen werden geändert – außer in Situationen, in denen die Namen nicht die standardmäßigen IDA-Namen sind (Funktionen mit Symbolen oder vom Benutzer geänderte). In diesen Fällen bleiben die Funktionsnamen erhalten und werden mit ihrem aktuellen Namen zur Vtable-Struktur hinzugefügt.
Die gewählten Namen folgen dem folgenden Muster:
vtable_vfunc_
Der Rest des Namens ist entweder der Offset vom Beginn des Segments. Dies liegt hauptsächlich daran, dass die meisten Binärdateien heutzutage PIE und PIC sind und daher ASLR erzwungen wird (anstatt den vollständigen Adressnamen zu verwenden, der in 64-Bit-Umgebungen ebenfalls recht lang ist).
Die Vtable-Struktur enthält außerdem einen Kommentar: „Was called from offset: XXXX“. Dieser Offset ist der Offset vom Beginn des Segments.Nach der Erstellung der Vtable fügt Virtuailor auch eine Verbindung zwischen der erstellten Struktur und der Assembly hinzu, wie in den folgenden Bildern zu sehen:

P.S.: Der im BP verwendete Strukturoffset ist nur für den letzten getätigten Aufruf relevant. Um ein besseres Verständnis aller getätigten virtuellen Aufrufe zu erhalten, wurde die Xref-Funktion hinzugefügt, wie im nächsten Abschnitt erläutert.
Beim statischen Reversingen von C++ ist es nicht trivial zu sehen, wer wen aufgerufen hat, da die meisten Aufrufe indirekte Aufrufe sind. Nach der Ausführung von Virtuailor hat jedoch jede indirekt aufgerufene Funktion nun einen Xref zu diesen Stellen.
Das folgende GIF zeigt die hinzugefügten Xrefs mit ihrem indirekten Funktionsaufruf:

Das Werkzeug wurde auf der RECon Brussels, Troopers und Warcon vorgestellt. Die Präsentation ist unter folgendem Link zu finden: https://www.youtube.com/watch?v=Xk75TM7NmtA
Den Crews von REcon Brussels, Troopers und Warcon, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
Das Plugin ist unter der GNU GPL v3-Lizenz lizenziert.