
Un fuzzer evolutivo basado en conocimiento
Este documento tiene como objetivo explicar brevemente la teoría detrás de Choronzon. Además, proporciona detalles sobre su funcionamiento interno y cómo se puede extender Choronzon para cumplir con nuevos requisitos. Una visión general de la arquitectura de Choronzon se presentó inicialmente en la Conferencia ZeroNights 2015. También están disponibles una grabación de la presentación y la presentación de diapositivas.
Choronzon es un fuzzer evolutivo. Intenta imitar el proceso evolutivo para seguir produciendo mejores resultados. Para lograrlo, cuenta con un sistema de evaluación que clasifica cuáles de los archivos fuzzeados son interesantes y cuáles deben descartarse.
Además, Choronzon es un fuzzer basado en conocimiento. Utiliza información definida por el usuario para leer y escribir archivos del formato de archivo objetivo. Para familiarizarse con la terminología de Choronzon, debe considerar que cada archivo está representado por un cromosoma. Los usuarios deben describir la estructura elemental del formato de archivo en consideración. Se prefiere una visión general de alto nivel del formato de archivo en lugar de describir cada detalle y aspecto del mismo. Cada una de esas estructuras elementales definidas por el usuario se considera un gen. Cada cromosoma contiene un árbol de genes y es capaz de construir el archivo correspondiente a partir de él.
Choronzon se divide en tres subsistemas: el módulo Tracer, el módulo Chromosome y el fuzzer.
Brevemente, el componente Chromosome se utiliza para describir el formato de archivo objetivo. Los usuarios pueden escribir sus propios módulos para admitir formatos nuevos o personalizados. Como caso de prueba, se proporciona un módulo PNG con Choronzon.
Por otro lado, el componente es responsable de monitorear la aplicación objetivo y recopilar diversa información sobre su ejecución. Esta versión de utiliza la herramienta de instrumentación binaria para registrar los bloques básicos que se visitaron durante la ejecución. Sin embargo, también es capaz de admitir otros backends de rastreo. Tenga en cuenta también que en la próxima versión de Choronzon, Pin será reemplazado debido a su impacto significativo en el rendimiento.
Por último, el componente fuzzer se utiliza para alterar el contenido de los archivos a probar. El módulo contiene un corpus de Mutadores y Recombinadores. Los Mutadores, simplemente, modifican el archivo como lo hacen los fuzzers comunes. Por ejemplo, realizan volteo de bytes, intercambio de bytes, mutación aleatoria de bytes, etc. Pero Choronzon tiene otra característica que no es tan común entre los fuzzers. Los Recombinadores utilizan la información sobre la estructura del formato de archivo, proporcionada por el módulo Chromosome, para realizar fuzzing inteligente.
En el directorio chromosome/parsers puede encontrar el archivo PNG.py. Este
módulo de Python describe el formato de archivo PNG al fuzzer. Puede agregar sus
módulos personalizados para otros formatos de archivo en este directorio.
La idea fundamental detrás del subsistema Chromosome es convertir los archivos semilla iniciales usando un Deserializer en un árbol de Genes. En algún momento, los Genes (fuzzeados) se escribirán en un archivo, usando un Serializer.
Considere que en Choronzon el objetivo del módulo analizador es proporcionar la estructura elemental del formato de archivo, en lugar de cada detalle menor. Esto ayudará al fuzzer a construir archivos que sean en su mayoría correctos, evitando salidas prematuras de la aplicación objetivo. Además, este enfoque ahorra tiempo, porque describir cada aspecto del formato de archivo consume tiempo e introduce una sobrecarga de desarrollo significativa.
Un nuevo módulo analizador debe importar:
y debe implementar
En el ejemplo incluido con Choronzon, cada PNGGene corresponde a un fragmento PNG. Generalmente, puede pensar en un Gene como una estructura de datos elemental del formato objetivo. Cada Chromosome se compone de un árbol de Genes y representa un archivo único. Cada Gene debe ser capaz de producir una cadena de bytes que contenga sus datos combinados con los datos de los Genes inferiores en el árbol.
El PNGSerializer debe ser capaz de producir un archivo (en su mayoría correcto) a partir de cuando se le proporciona una lista de Genes. Por otro lado, PNGDeserializer debe ser capaz de analizar un archivo válido del formato objetivo y deserializarlo en un árbol de Genes.
Consulte chromosome/parsers/PNG.py para ver un ejemplo comentado para el formato PNG.
El módulo Tracer se utiliza para desensamblar la aplicación objetivo (y/o una o más de sus bibliotecas). En esta versión de Choronzon esto se logra con IDA. Usamos este enfoque porque podemos correlacionar cualquier información interesante de la campaña de fuzzing con nuestros IDB. Sin embargo, es posible que eliminemos la dependencia de IDA en un futuro cercano para hacer Choronzon más portátil y accesible.
Un archivo se prueba contra una aplicación con la ayuda de una utilidad Pin. En el
directorio analyzer/coverage se encuentra el código fuente de esta herramienta Pin, que
inyecta hooks al comienzo de cada bloque básico en la aplicación objetivo.
Cuando la ejecución finaliza, correlacionamos el bloque básico que fue alcanzado con
el bloque básico del binario. Por lo tanto, podemos calcular métricas que son
valiosas para nosotros (cobertura, etc).
El componente Fuzzer utiliza la representación Chromosome para fuzzear un archivo. Como se mencionó anteriormente, hay dos métodos de fuzzing en Choronzon.
Para el primer método, Choronzon obtiene el contenido de uno o más genes
y aplica uno de los Mutadores. Los Mutadores implementan métodos de fuzzing comunes
pero efectivos, como mutación aleatoria de bytes, establecimiento de bit alto, intercambio de bytes
y muchos más. También puede escribir sus propios mutadores personalizados y agregarlos en
fuzzers/mutators.py.
El segundo método de fuzzing se llama recombinación. Los Recombinadores se utilizan para cambiar la estructura del archivo. Aquí hay un ejemplo con el formato PNG.
Los archivos PNG se componen de fragmentos consecutivos que contienen cuatro campos:
Supongamos que tenemos un archivo PNG que solo tiene fragmentos IHDR, IDAT e IEND. Su estructura se vería así:
[ Firma PNG ] [ IHDR ] [ IDAT ] [ IEND ]
Dado que Choronzon conoce las estructuras básicas (es decir, los fragmentos PNG), es capaz de alterar su secuencia. Después de una recombinación exitosa, el archivo PNG de salida fuzzeado puede verse así:
[ Firma PNG ] [ IDAT ] [ IHDR ] [ IEND ]
Choronzon contiene muchas más estrategias de recombinación que lo hacen capaz de manejar incluso formatos de archivo complicados.
Choronzon ha sido probado con Python 2.7, Pin 3, IDA Pro 6.6 a 6.9, en Ubuntu 16.04 LTS (kernel de Linux 4.4) y Windows 10.
Para ejecutarlo, necesitará instalar el paquete Python sortedcontainers. Puede encontrarlo aquí o instalarlo a través de pip.
Además, Choronzon necesita IDA Pro (en realidad, su versión terminal). La ruta de IDA Pro debe especificarse en su archivo de configuración de la siguiente manera:
DisassemblerPath = 'C:\\Program Files (x86)\\IDA 6.6'
Se ha probado con éxito con IDA Pro 6.6, 6.7, 6.8 y 6.9.
La herramienta Pin de cobertura de Choronzon se encuentra en analyzer/coverage y debe
compilarse. Puede consultar la documentación de Pin para obtener detalles, o puede
realizar los siguientes pasos:
coverage.cpp y makefile.rules a
/ruta/a/pin/source/tools/MyPinToolmake. Si está en Windows, debe ejecutar la línea de comandos de Visual
Studio y usar la utilidad make y sus dependencias desde
Cygwin/ruta/a/choronzon/analysis/coverage el directorio recién creado
obj-intel64 (o obj-ia32 para sistemas de 32 bits)Para fuzzear con Choronzon, debe proporcionar un archivo de configuración.
En el directorio settings hay un ejemplo de la configuración de Choronzon.