
Melkor est un fuzzer de format de fichier ELF très intuitif et facile à utiliser pour trouver des bugs fonctionnels et de sécurité dans les parseurs ELF.
--------------------------------~
| -- DESCRIPTION -- |
--------------------------------~
Melkor - Un fuzzer du format de fichier ELF
Melkor, un personnage fictif du legendarium de la Terre du Milieu de J. R. R. Tolkien, fut le premier Seigneur des Ténèbres et le maître de Sauron. Il est brièvement mentionné dans Le Seigneur des Anneaux et est connu pour :
"... Melkor avait capturé un certain nombre d'ELFES avant que les Valar ne l'attaquent, et il les tortura et les corrompit, engendrant les premiers Orques." (http://en.wikipedia.org/wiki/Morgoth)
"... Melkor était rusé et plus rempli de malice que jamais. Voyant le bonheur des ELFES et se rappelant que c'était pour eux qu'il avait été renversé, Melkor désirait par-dessus tout les corrompre." (http://lotr.wikia.com/wiki/Melkor)
"Orques... Il en est ainsi depuis le jour où ils ont été engendrés par Melkor à partir d'ELFES corrompus, torturés et mutilés, qui ont peut-être aussi été forcés de se reproduire avec d'autres abominations contre nature dans le domaine des Puissances des Ténèbres." (http://lotr.wikia.com/wiki/Orcs)
Pour honorer son nom, ce morceau de code prend un ELF, le corrompt et crée autant d'orques que vous le souhaitez.
Melkor est un fuzzer hybride (basé sur la mutation et sur la génération). Il mute les données existantes d'un échantillon ELF fourni pour créer des orques (ELF malformés). Cependant, il ne modifie pas les valeurs de manière aléatoire (fuzzing aveugle) ; il fuzze plutôt certaines métadonnées avec des valeurs semi-valides grâce à des règles de fuzzing (base de connaissances). Écrit en C, Melkor est un fuzzer très intuitif et facile à utiliser pour trouver des bugs fonctionnels (et de sécurité) dans les parseurs ELF.
Les règles de fuzzing ont été conçues en tenant compte des éléments suivants :
Vous trouverez les règles de fuzzing en détail ainsi que quelques autres schémas dans le répertoire docs/.
--------------------------------~
| -- PRÉREQUIS -- |
--------------------------------~
--------------------------------~
| -- COMPILATION ET UTILISATION -- |
--------------------------------~
La compilation est très simple, tapez simplement : $make
Cela créera le fichier 'melkor', qui est le fuzzer lui-même, ainsi que d'autres fichiers ELF dans le dossier templates/, notamment des fichiers ELF normaux comme un exécutable ELF standard, des bibliothèques partagées, un ELF statique (exécutable autonome) et quelques autres.
En exécutant melkor, une liste d'options s'affichera et vous constaterez qu'il est très intuitif et facile à utiliser. Tout ce que vous avez à fournir est le nom d'un ELF à utiliser comme modèle, qui peut être n'importe lequel de ceux présents dans le répertoire templates/.
Selon le type de logiciel que vous souhaitez tester, vous devez choisir les métadonnées que vous voulez fuzzer. Par exemple, si vous voulez tester un chargeur de système d'exploitation, vous voudrez probablement fuzzer uniquement la table des en-têtes de programme (-P) et/ou la section dynamique (-D). D'un autre côté, vous voudrez peut-être fuzzer la table des en-têtes de section et l'en-tête ELF pour tester un moteur antivirus ou un débogueur. Fuzzer les tables de symboles (-s) et/ou les tables de relocalisation (-R) sur des fichiers relocalisables (.o) ou des bibliothèques partagées (.so) pour tester les compilateurs et/ou les éditeurs de liens. Les tables de chaînes peuvent également être fuzzées (-Z). C'est à vous de décider à quel point vous voulez corrompre un ELF }:-)
Une fois les orques créés dans le répertoire orcs_*/, il est temps de les tester à l'aide de test_fuzzed.sh, où vous pouvez simplement spécifier le nom du dossier contenant les orques à exécuter (test du chargeur de système d'exploitation) ou ajouter un paramètre supplémentaire pour spécifier quel programme (et ses paramètres) vous souhaitez tester contre chaque ELF malformé du dossier orcs. Ce script a la possibilité de fuzzer certaines variables d'environnement (définies également comme règles de fuzzing). Afficher les journaux avec #dmesg après l'exécution du script peut être utile pour identifier quel programme/bibliothèque a planté et où ce plantage s'est produit. Quelques exemples sont affichés en exécutant le script sans paramètres.
Si vous souhaitez tester automatiquement les ELF malformés (orques) dans un environnement Windows, un script batch (win_test_fuzzed.bat) est inclus, avec presque les mêmes fonctionnalités que le script pour *NIX.
Bon fuzzing !
--------------------------------~
| -- RÉPERTOIRES -- |
--------------------------------~
docs/ Contient la documentation associée, comme la liste détaillée des règles de fuzzing ainsi que la liste des dépendances des métadonnées ELF.
templates/ Il contient quelques fichiers ELF compilés en même temps que melkor et qui peuvent être utilisés pour alimenter melkor : foo.c -> foo.o (objet ELF)-> foo (exécutable ELF) foo.c -> foo_static (exécutable statique ELF) libfoo.c -> libfoo.so (objet partagé ELF) et quelques autres. Tapez "$make templ" pour voir en détail quels autres modèles ELF sont créés.
orcs_*/ Contiendra les fichiers ELF malformés (basés sur le fichier modèle fourni) créés après le processus de fuzzing.
src/ Le code source de Melkor.
--------------------------------~
| -- BUGS -- |
--------------------------------~
Veuillez lire BUGS.txt
--------------------------------~
| -- CONTACT -- |
--------------------------------~
Nom : Alejandro Hernandez H. [nitr0us] Twitter : http://twitter.com/nitr0usmx Email : nitrousenador [at] gmail [dot] com Site Web : http://www.brainoverflow.org Blog : http://chatsubo-labs.blogspot.com
--------------------------------~
| -- IN MEMORIAL -- |
--------------------------------~
Ce projet est dédié à la mémoire de l'un de mes meilleurs amis, Aaron Alba.
--------------------------------~
| -- LICENCE -- |
--------------------------------~
Melkor - Un fuzzer du format de fichier ELF Copyright (C) 2014 Alejandro Hernandez H. (nitr0us)
Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la licence publique générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre choix) toute version ultérieure.
Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de QUALITÉ MARCHANDE ou d'ADÉQUATION À UN USAGE PARTICULIER. Voir la licence publique générale GNU pour plus de détails.
Vous devriez avoir reçu une copie de la licence publique générale GNU avec ce programme. Si ce n'est pas le cas, consultez http://www.gnu.org/licenses/.