
Gewinner des IDA 2016 Plugin-Wettbewerbs! Symbolische Ausführung nur einen Klick entfernt!
Ponce (ausgesprochen [ 'poN θe ] pon-they) ist ein IDA Pro Plugin, das Benutzern die Möglichkeit bietet, Taint-Analyse und symbolische Ausführung an Binärdateien auf einfache und intuitive Weise durchzuführen. Mit Ponce sind Sie nur einen Klick davon entfernt, die volle Leistung modernster symbolischer Ausführung zu nutzen. Vollständig in C/C++ geschrieben.
Symbolische Ausführung ist kein neues Konzept in der Sicherheitscommunity. Es existiert schon seit vielen Jahren, aber erst um 2015 herum wurden Open-Source-Projekte wie Triton und Angr geschaffen, um diesen Bedarf zu decken. Trotz der Verfügbarkeit dieser Projekte müssen Endanwender oft selbst spezifische Anwendungsfälle implementieren.
Wir haben diesen Bedarf erkannt und Ponce entwickelt, ein IDA-Plugin, das symbolische Ausführung und Taint-Analyse innerhalb des am häufigsten verwendeten Disassemblers/Debuggers für Reverse Engineers implementiert.
Ponce funktioniert sowohl mit x86- als auch mit x64-Binärdateien in jeder IDA-Version >= 7.0. Die Installation des Plugins ist so einfach wie das Kopieren der entsprechenden Dateien aus den aktuellen Builds in den Ordner plugins\ Ihres IDA-Installationsverzeichnisses.
Stellen Sie sicher, dass Sie die für Ihre IDA-Version kompilierte Ponce-Binärdatei verwenden, um Inkompatibilitäten zu vermeiden.
Ponce funktioniert nativ unter Windows, Linux und OSX!
Das Plugin wird beim ersten Start automatisch ausgeführt und führt Sie durch die anfängliche Konfiguration. Die Konfiguration wird in einer Konfigurationsdatei gespeichert, sodass Sie sich nicht erneut um das Konfigurationsfenster kümmern müssen.
Im folgenden GIF sehen wir die Verwendung des automatischen Taintings und wie wir eine Bedingung negieren und während des Debuggens in den Speicher injizieren können:
argv zu symbolisieren.elite, der in den Speicher injiziert wurde, und erreichen somit den Win-Code.Der Quellcode des CrackMe befindet sich hier

In diesem Beispiel sehen wir die Verwendung der Tainting-Engine mit cmake. Wir:
fread() aus der Datei liest.
Im nächsten Beispiel verwenden wir die Snapshot-Engine:
fread() aus der Datei liest.
Der Beispielquellcode befindet sich hier
In diesem Abschnitt listen wir die verschiedenen Ponce-Optionen sowie die Tastaturkürzel auf:













Ponce baut auf dem Triton-Framework auf, um Semantiken, Taint-Analyse und symbolische Ausführung bereitzustellen. Triton ist ein großartiges Open-Source-Projekt, das von Quarkslab gesponsert und hauptsächlich von Jonathan Salwan mit einer umfangreichen Bibliothek gepflegt wird. Wir möchten Jonathans Arbeit mit Triton danken und unterstützen. Du rockst! :)
Seit Ponce v0.3 haben wir den Build-Prozess auf CMake umgestellt. Dadurch vereinheitlichen wir die Konfiguration und Erstellung für Linux, Windows und OSX. Wir unterstützen jetzt die Rückmeldung im Pseudocode über symbolische oder Taint-Instruktionen. Damit diese Funktion funktioniert, müssen Sie hexrays.hpp in Ihren IDA-SDK-Include-Ordner einfügen. hexrays.hpp befindet sich unter plugins/hexrays_sdk/ in Ihrem IDA-Installationspfad. Falls Sie den Hex-Rays Decompiler nicht erworben haben, können Sie Ponce trotzdem mit -DBUILD_HEXRAYS_SUPPORT=OFF erstellen. Wir verwenden Github Actions als CI-Umgebung. Überprüfen Sie die Aktionsdateien, wenn Sie verstehen möchten, wie der Build-Prozess abläuft.
Juan Ponce de León (1474 – Juli 1521) war ein spanischer Entdecker und Konquistador. Er entdeckte Florida in den Vereinigten Staaten. Das IDA-Plugin wird Ihnen helfen, die verschiedenen Pfade in einer Binärdatei zu entdecken, zu erkunden und hoffentlich zu erobern.
Ja, Sie können Ponce nativ in IDA für Windows verwenden oder sich remote mit einem Linux- oder OS X-Rechner verbinden und es nutzen. In der nächsten Ponce-Version werden wir Ponce nativ für Linux- und OS X-IDA-Versionen unterstützen.
In unseren Tests erreichen wir eine Verarbeitung von 3000 Anweisungen pro Sekunde. Wir planen, den PIN-Tracer von IDA zu verwenden, um die Geschwindigkeit zu erhöhen.
Eröffnen Sie ein Issue, wir werden es schnellstmöglich lösen ;)
Klar! Bitte machen Sie Pull-Requests und arbeiten Sie an den offenen Issues. Wir werden Sie in Form von Bier für Ihre Hilfe bezahlen ;)
Concolic Execution und Ponce haben einige Probleme:
Symbolischer Speicherzugriff/Schreiben: Wenn der Index, der zum Lesen eines Speicherwerts verwendet wird, symbolisch ist, wie in x = array[symbolic_index], können Probleme auftreten, die zum Verlust der Verfolgung der getainteten/symbolisierten benutzergesteuerten Eingabe führen können.
Triton funktioniert nicht gut mit Gleitkomma-Anweisungen.
Concolic Execution analysiert nur die ausgeführten Anweisungen. Das bedeutet, dass die symbolische Verfolgung in Fällen wie dem folgenden verloren geht:
int check(char myinput) // Eingabe ist symbolisch/getaintet
{
int flag = 0;
if (myinput == 'A') // Diese Bedingung ist symbolisch/getaintet
flag = 1
else
flag = -1;
return flag; // flag ist nicht symbolisch/getaintet!
}