
Melkor ist ein sehr intuitiver und einfach zu verwendender Fuzzer für das ELF-Dateiformat, um funktionale und Sicherheitsfehler in ELF-Parsern zu finden.
--------------------------------~
| -- BESCHREIBUNG -- |
--------------------------------~
Melkor - Ein ELF-Dateiformat-Fuzzer
Melkor, eine fiktive Figur aus J. R. R. Tolkiens Mittelerde- Legendarium, war der erste Dunkle Herr und Meister Saurons. Er wird kurz in Der Herr der Ringe erwähnt und ist bekannt für:
"... Melkor hatte eine Reihe von ELBEN gefangen genommen, bevor die Valar ihn angriffen, und er folterte und korrumpierte sie und züchtete die ersten Orks." (http://en.wikipedia.org/wiki/Morgoth)
"... Melkor war verschlagen und boshafter als je zuvor. Als er das Glück der ELBEN sah und sich daran erinnerte, dass er ihretwegen gestürzt worden war, begehrte Melkor vor allem, sie zu verderben." (http://lotr.wikia.com/wiki/Melkor)
"Orks... Dies ist so gewesen seit dem Tag, an dem sie von Melkor aus verderbten, gefolterten und verstümmelten ELBEN gezüchtet wurden, die womöglich auch dazu gezwungen wurden, sich in der Herrschaft der Dunklen Mächte mit anderen unnatürlichen Abscheulichkeiten zu paaren." (http://lotr.wikia.com/wiki/Orcs)
Zu Ehren seines Namens nimmt dieses Stück Code eine ELF-Datei, korrumpiert sie und erzeugt so viele Orks, wie du willst.
Melkor ist ein hybrider Fuzzer (mutations- und generationsbasiert). Er mutiert die vorhandenen Daten einer übergebenen ELF-Beispieldatei, um Orks (fehlerhafte ELF-Dateien) zu erzeugen; er ändert die Werte jedoch nicht zufällig (dumb fuzzing), sondern fuzzt bestimmte Metadaten mithilfe von Fuzzing-Regeln (Wissensbasis) mit semi-validen Werten. In C geschrieben, ist Melkor ein sehr intuitiver und benutzerfreundlicher Fuzzer, um Funktions- (und Sicherheits-)Fehler in ELF-Parsern zu finden.
Die Fuzzing-Regeln wurden anhand der folgenden Eingaben entworfen:
Die Fuzzing-Regeln im Detail und einige weitere Schemata findest du im Verzeichnis docs/.
--------------------------------~
| -- VORAUSSETZUNGEN -- |
--------------------------------~
--------------------------------~
| -- KOMPILIERUNG & VERWENDUNG -- |
--------------------------------~
Die Kompilierung ist sehr unkompliziert, tippe einfach: $make
Es erstellt die Datei 'melkor' (den Fuzzer selbst) sowie einige andere ELF-Dateien im Ordner templates/, darunter normale ELF-Dateien wie beispielsweise ein normales ELF-Programm, einige gemeinsame Bibliotheken, ein statisches ELF (eigenständig ausführbares Programm) und einige andere.
Wenn du melkor ausführst, wird eine Liste von Optionen angezeigt, und du wirst feststellen, dass es sehr intuitiv und benutzerfreundlich ist. Du musst lediglich den Namen einer ELF-Datei angeben, die als Vorlage verwendet werden soll; dies kann eine beliebige der Dateien im Ordner templates/ sein.
Je nachdem, welche Art von Software du testen möchtest, musst du auswählen, welche Metadaten du fuzzen willst. Wenn du beispielsweise einen OS-Loader testen möchtest, solltest du wahrscheinlich nur die Program Header Table (-P) und/oder den Dynamic Section (-D) fuzzen. Andererseits möchtest du vielleicht die Section Header Table und den ELF-Header fuzzen, um eine Antiviren-Engine oder einen Debugger zu testen. Das Fuzzen der Symboltabellen (-s) und/oder der Relokationstabellen (-R) bei relozierbaren Dateien (.o) oder gemeinsamen Bibliotheken (.so), um Compiler und/oder Linker zu testen. Auch die String-Tabellen können gefuzzt werden (-Z). Es liegt ganz bei dir zu entscheiden, wie stark du eine ELF-Datei korrumpieren möchtest }:-)
Sobald die Orks im Verzeichnis orcs_*/ erstellt wurden, ist es an der Zeit, sie mit Hilfe von test_fuzzed.sh zu testen. Dort kannst du einfach den Namen des Ordners mit den auszuführenden Orks angeben (OS-Loader-Tests) oder einen zusätzlichen Parameter hinzufügen, um anzugeben, welches Programm (und welche Parameter) du gegen jede fehlerhafte ELF-Datei im Orks-Ordner testen möchtest. Dieses Skript bietet die Option, einige Umgebungsvariablen zu fuzzen (die ebenfalls als Fuzzing-Regeln definiert sind). Das Anzeigen der Logs mit #dmesg nach dem Ausführen des Skripts kann nützlich sein, um zu identifizieren, welches Programm bzw. welche Bibliothek abgestürzt ist und wo der Absturz aufgetreten ist. Beim Ausführen des Skripts ohne Parameter werden einige Beispiele angezeigt.
Wenn du die fehlerhaften ELF-Dateien (Orks) automatisch in einer Windows-Umgebung testen möchtest, ist ein Batch-Skript (win_test_fuzzed.bat) enthalten, das fast die gleiche Funktionalität bietet wie das Skript für *NIX.
Viel Spaß beim Fuzzing !
--------------------------------~
| -- VERZEICHNISSE -- |
--------------------------------~
docs/ Enthält die zugehörige Dokumentation, wie die detaillierte Liste der Fuzzing-Regeln sowie die Liste der ELF-Metadaten-Abhängigkeiten.
templates/ Enthält einige ELF-Dateien, die zur gleichen Zeit wie melkor kompiliert wurden und zum Füttern von melkor verwendet werden können: foo.c -> foo.o (ELF object)-> foo (ELF executable) foo.c -> foo_static (ELF static executable) libfoo.c -> libfoo.so (ELF shared object) und einige andere. Tippe "$make templ" ein, um im Detail zu sehen, welche anderen ELF-Vorlagen erstellt werden.
orcs_*/ Wird die fehlerhaften ELF-Dateien enthalten (basierend auf der angegebenen Vorlagendatei), die nach dem Fuzzing-Prozess erstellt wurden.
src/ Quellcode von Melkor.
--------------------------------~
| -- FEHLER -- |
--------------------------------~
Bitte lies BUGS.txt.
--------------------------------~
| -- KONTAKT -- |
--------------------------------~
Name: Alejandro Hernandez H. [nitr0us] Twitter: http://twitter.com/nitr0usmx E-Mail: nitrousenador [at] gmail [dot] com Website: http://www.brainoverflow.org Blog: http://chatsubo-labs.blogspot.com
--------------------------------~
| -- IN MEMORIAM -- |
--------------------------------~
Dieses Projekt ist dem Andenken eines meiner besten Freunde, Aaron Alba, gewidmet.
--------------------------------~
| -- LIZENZ -- |
--------------------------------~
Melkor - Ein ELF-Dateiformat-Fuzzer Copyright (C) 2014 Alejandro Hernandez H. (nitr0us)
Dieses Programm ist freie Software: Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weiterverbreiten und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren Version.
Dieses Programm wird in der Hoffnung verbreitet, dass es nützlich sein wird, aber OHNE JEDE GARANTIE; ohne selbst die stillschweigende Garantie der MARKTGÄNGIGKEIT oder der EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details entnehmen Sie der GNU General Public License.
Sie sollten zusammen mit diesem Programm eine Kopie der GNU General Public License erhalten haben. Falls nicht, siehe http://www.gnu.org/licenses/.