
Melkor es un fuzzer del formato de archivo ELF muy intuitivo y fácil de usar para encontrar errores funcionales y de seguridad en los parsers de ELF.
--------------------------------~
| -- DESCRIPCIÓN -- |
--------------------------------~
Melkor - Un fuzzer del formato de archivo ELF
Melkor, un personaje ficticio del legendarium de la Tierra Media de J. R. R. Tolkien, fue el primer Señor Oscuro y maestro de Sauron. Se le menciona brevemente en El Señor de los Anillos y es conocido por:
"... Melkor había capturado a varios ELFOS antes de que los Valar lo atacaran, y los torturó y corrompió, criando a los primeros Orcos." (http://en.wikipedia.org/wiki/Morgoth)
"... Melkor era astuto y estaba más lleno de malicia que nunca. Al ver la dicha de los ELFOS y recordar que fue por ellos que fue derrocado, Melkor deseaba por encima de todo corromperlos." (http://lotr.wikia.com/wiki/Melkor)
"Orcos...Así ha sido desde el día en que fueron criados por Melkor a partir de ELFOS corruptos, torturados y mutilados, que también pueden haber sido obligados a aparearse con otras abominaciones antinaturales bajo el dominio de los Poderes Oscuros." (http://lotr.wikia.com/wiki/Orcs)
Para honrar su nombre, este fragmento de código toma un ELF, lo corrompe y crea tantos Orcos como quieras.
Melkor es un fuzzer híbrido (basado en mutación y en generación). Muta los datos existentes en una muestra ELF proporcionada para crear orcos (ELF malformados); sin embargo, no cambia los valores de forma aleatoria (fuzzing ciego), sino que fuzzea ciertos metadatos con valores semiválidos mediante el uso de reglas de fuzzing (base de conocimiento). Escrito en C, Melkor es un fuzzer muy intuitivo y fácil de usar para encontrar errores funcionales (y de seguridad) en los parsers de ELF.
Las reglas de fuzzing se diseñaron teniendo en cuenta las siguientes fuentes:
Encontrarás las reglas de fuzzing en detalle y algunos otros esquemas en el directorio docs/.
--------------------------------~
| -- REQUISITOS -- |
--------------------------------~
--------------------------------~
| -- COMPILACIÓN Y USO -- |
--------------------------------~
La compilación es muy sencilla, solo tienes que escribir:
$make
Creará el archivo 'melkor', que es el propio fuzzer, y algunos otros archivos ELF dentro de la carpeta templates/, incluidos archivos ELF normales, como un ejecutable ELF normal, algunas bibliotecas compartidas, un ELF estático (ejecutable independiente) y algunos otros.
Al ejecutar melkor, se mostrará una lista de opciones y te darás cuenta de que es muy intuitivo y fácil de usar. Todo lo que tienes que proporcionar es el nombre de un ELF para usar como plantilla, que puede ser cualquiera de los que se encuentran dentro del directorio templates/.
Dependiendo del tipo de software que quieras probar, tienes que elegir qué metadatos quieres fuzzear. Por ejemplo, si quieres probar un cargador de SO, probablemente querrás fuzzear solo la Tabla de Cabeceras de Programa (-P) y/o la Sección Dinámica (-D). Por otro lado, quizás quieras fuzzear la Tabla de Cabeceras de Sección y la Cabecera ELF para probar algún motor antivirus o depurador. Fuzzear las Tablas de Símbolos (-s) y/o las Tablas de Reubicaciones (-R) en archivos reubicables (.o) o bibliotecas compartidas (.so) para probar compiladores y/o enlazadores. Las Tablas de Cadenas también se pueden fuzzear (-Z). Depende de ti decidir cuánto quieres corromper un ELF }:-)
Una vez que los orcos se han creado dentro del directorio orcs_*/, es hora de probarlos con la ayuda de test_fuzzed.sh, donde puedes simplemente especificar el nombre de la carpeta con los orcos que se ejecutarán (pruebas del cargador de SO) o agregar un parámetro extra para especificar qué programa (y sus parámetros) te gustaría probar contra cada ELF malformado dentro de la carpeta de orcos. Este script tiene la opción de fuzzear algunas variables de entorno (definidas también como reglas de fuzzing). Mostrar los logs con #dmesg después de ejecutar el script puede ser útil para identificar qué programa/biblioteca falló y dónde ocurrió ese fallo. Se muestran algunos ejemplos al ejecutar el script sin parámetros.
Si quieres probar los ELF malformados (orcos) automáticamente en un entorno Windows, se incluye un script por lotes (win_test_fuzzed.bat) con casi la misma funcionalidad que el script para *NIX.
¡Feliz fuzzing!
--------------------------------~
| -- DIRECTORIOS -- |
--------------------------------~
docs/ Contiene la documentación relacionada, como la lista detallada de reglas de fuzzing, así como la lista de dependencias de los metadatos ELF.
templates/ Contiene algunos archivos ELF compilados al mismo tiempo que melkor y que pueden usarse para alimentar a melkor: foo.c -> foo.o (objeto ELF)-> foo (ejecutable ELF) foo.c -> foo_static (ejecutable ELF estático) libfoo.c -> libfoo.so (objeto compartido ELF) y algunos otros. Escribe "$make templ" para ver en detalle qué otras plantillas ELF se crean.
orcs_*/ Contendrá los archivos ELF malformados (basados en el archivo de plantilla proporcionado) creados después del proceso de fuzzing.
src/ Código fuente de Melkor.
--------------------------------~
| -- ERRORES -- |
--------------------------------~
Por favor, lee BUGS.txt
--------------------------------~
| -- CONTACTO -- |
--------------------------------~
Nombre: Alejandro Hernandez H. [nitr0us] Twitter: http://twitter.com/nitr0usmx Email: nitrousenador [at] gmail [dot] com Web: http://www.brainoverflow.org Blog: http://chatsubo-labs.blogspot.com
--------------------------------~
| -- EN MEMORIA -- |
--------------------------------~
Este proyecto está dedicado a la memoria de uno de mis mejores amigos, Aaron Alba.
--------------------------------~
| -- LICENCIA -- |
--------------------------------~
Melkor - Un fuzzer del formato de archivo ELF Copyright (C) 2014 Alejandro Hernandez H. (nitr0us)
Este programa es software libre: puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior.
Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulta la Licencia Pública General GNU para obtener más detalles.
Deberías haber recibido una copia de la Licencia Pública General GNU junto con este programa. Si no es así, consulta http://www.gnu.org/licenses/.