
Verteilter, code-coverage-gesteuerter snapshot-basierter Fuzzer für Benutzermodus- und Kernelmodus-Ziele auf Windows und Linux, mit Emulator- und Hypervisor-Backends.
what the fuzzEin verteilter, code-abdeckungsgesteuerter, plattformübergreifender snapshot-basierter Fuzzer, der für Angriffe auf Benutzer- und/oder Kernel-Modus-Ziele unter Microsoft Windows und Linux-Benutzermodus (experimentell!) entwickelt wurde.
what the fuzz oder wtf ist ein verteilter, code-abdeckungsgesteuerter, anpassbarer, plattformübergreifender snapshot-basierter Fuzzer, der für Angriffe auf Benutzer- und/oder Kernel-Modus-Ziele unter Microsoft Windows oder Linux (experimentell, siehe linux_mode) entwickelt wurde. Die Ausführung des Ziels kann innerhalb eines Emulators mit bochscpu (langsam, präzise), innerhalb einer Windows-VM mit den Windows Hypervisor Platform APIs oder innerhalb einer Linux-VM mit den KVM APIs (schnellste) erfolgen.
Es deckte Speicherkorruptions-Schwachstellen in einer Vielzahl von Software auf: IDA Pro, ein beliebtes AAA-Spiel, den Windows-Kernel, den Microsoft RDP-Client, den NVIDIA GPU Display-Treiber, usw.
Kompilierte Binärdateien sind entweder aus den CI-Artefakten oder aus dem Abschnitt Releases für Windows und Linux verfügbar.
Wenn Sie mehr über seine Geschichte oder die Verwendung an einem echten Ziel erfahren möchten, empfehle ich, sich diese Beiträge anzusehen, um loszulegen 🔥
Die beste Möglichkeit, die Funktionen auszuprobieren, ist die Arbeit mit den Modulen fuzzer_hevd / fuzzer_tlv_server. Sie können die Archive target-hevd.7z / target-tlv_server.7z herunterladen und in das Verzeichnis targets/ extrahieren. Die Archive enthalten die Verzeichnisstrukturen, die für alle Ziele erwartet werden:
inputs ist der Ordner, in den Ihre Eingabe-Testfälle abgelegt werden,outputs ist der Ordner, in den die aktuellen Minset-Dateien gespeichert werden,coverage ist der Ordner, in dem die .cov-Dateien erwartet werden,crashes ist der Ort, an dem die Abstürze gespeichert werden,state ist der Ort, an dem der Speicherauszug (mem.dmp) sowie der CPU-Zustand (regs.json) und der Symbol-Store (symbol-store.json) gespeichert werden. Der Symbol-Store ist eine einfache JSON-Datei, die auf Linux-Systemen verwendet wird, um zu wissen, wo Haltepunkte gesetzt werden müssen, da auf diesen Plattformen keine Unterstützung für Symbole / dbgeng vorhanden ist. wtf generiert diese Datei zur Laufzeit jedes Mal, wenn Sie Ihr Ziel unter Windows ausführen.Im Folgenden wird davon ausgegangen, dass Sie die Datei target-hevd.7z des neuesten Releases heruntergeladen und in das targets-Verzeichnis Ihres Klons von wtf extrahiert haben. Sie sollten wtf/targets/hevd haben, in dem Sie die Verzeichnisse inputs / outputs, usw. finden.
Der Server ist im Grunde das Gehirn und verwaltet den gesamten Zustand: die aggregierte Code-Abdeckung, das Korpus, er generiert und verteilt die Testfälle an den Client.
So könnten Sie einen lokalen Server-Knoten starten:```text wtf.exe master --name hevd --max_len=1028 --runs=10000000
Die Option `max_len` wird verwendet, um die Größe des generierten Testfalls zu begrenzen, `runs` ist die Anzahl der Testfälle, die generiert werden, `address` gibt an, wo **wtf** lauschen muss, `target` ist ein Verzeichnis mit dem oben beschriebenen Verzeichnisbaum (der Benutzer kann diese Verzeichnisse auch mit `--input` / `--output` / `--crashes` überschreiben) und `name` gibt den Namen Ihres Fuzzing-Moduls an, damit der Master Ihre Generatorfunktion aufrufen kann, falls Sie eine definiert haben.
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/4a03fc75eed3ed5a92f7f10def697dbf220ae36b0701f05b37759eb432fc0fd9.webp">
</p>
### Fuzzing-Knoten
Die Client-Knoten führen einen Testfall aus, der vom Server generiert und verteilt wurde, und übermitteln das Ergebnis zurück an den Server (Codeabdeckung, Ergebnis usw.).
So würden Sie einen Client-Knoten starten, der das *bochscpu*-Backend verwendet:```text
wtf.exe fuzz --name hevd --limit 10000000
Der Befehl fuzz wird mit der Option name verwendet, um anzugeben, welches Fuzzer-Modul verwendet werden soll. backend gibt das Ausführungs-Backend an und limit die maximale Anzahl von Anweisungen, die pro Testfall ausgeführt werden sollen (abhängig vom Backend hat diese Option eine unterschiedliche Bedeutung).
Wenn Sie einen Testfall (oder einen Ordner mit Testfällen) ausführen möchten, können Sie den Befehl run verwenden.
So würden Sie den Testfall crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0 ausführen:```
wtf.exe run --name hevd --limit 10000000 --input crashes\crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/49b3ca8582d6314724e5615c687472499d5f8f41d04c9543c0a6a070c51f56f8.webp">
</p>
### Minseting a corpus
Um einen Corpus zu minset, müssen Sie einen Serverknoten sowie so viele Clientknoten wie nötig verwenden, ähnlich wie bei einem Fuzzing-Job. Sie können einfach die `runs`-Optionen auf 0 setzen.