
Complemento de Binary Ninja para identificar código ofuscado y otras construcciones de código interesantes
Autor: Tim Blazytko
Detectar automáticamente código ofuscado y otras construcciones de código interesantes
Obfuscation Detection es un plugin de Binary Ninja para detectar código ofuscado y construcciones de código interesantes (por ejemplo, máquinas de estado) en binarios. Dado un binario, el plugin facilita el análisis identificando ubicaciones de código que podrían merecer un examen más detallado durante la ingeniería inversa.
Basado en varias heurísticas, el plugin señala funciones que contienen construcciones de código complejas o poco comunes. Dichas construcciones pueden implementar
Las siguientes publicaciones de blog proporcionan más información sobre las heurísticas subyacentes y demuestran sus casos de uso:
Algunos casos de uso de ejemplo se pueden encontrar en ejemplos. Además, la charla de REcon "Unveiling Secrets in Binaries using Code Detection Strategies" demuestra algunos casos de uso. Las diapositivas se pueden encontrar aquí; la grabación se puede encontrar aquí.
La herramienta se puede instalar usando el administrador de plugins de Binary Ninja.
Para la versión headless, siga estos pasos:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# instalar obfuscation_detection
pip install .
El plugin se puede utilizar en la interfaz de usuario y en modo headless.
Elija Plugins -> Obfuscation Detection para ejecutar heurísticas individuales, o Plugins -> Obfuscation Detection -> Utils para ejecutar detecciones de utilidad individuales. El comando Plugins -> Obfuscation Detection -> All ejecuta todas las heurísticas y todas las utilidades juntas.
Los resultados se muestran en la ventana de Log:
Al hacer clic en las direcciones de función identificadas, Binary Ninja navega a la función seleccionada.
Para usar el plugin en modo headless, ejecute scripts/detect_obfuscation.py:
$ python3 scripts/detect_obfuscation.py <binario>
Esto ejecuta todas las heurísticas y todas las utilidades. Para obtener una salida legible por máquina, pase --json:
$ python3 scripts/detect_obfuscation.py --json <binario>
El payload JSON contiene todos los resultados bajo la clave detections. Cada detección tiene un id estable para automatización y un name legible por humanos. Cada hallazgo de función etiquetada incluye el tipo de etiqueta y la descripción utilizados por el plugin de Binary Ninja.
Para ejecutar solo la heurística de máquina de estado en modo headless, use scripts/detect_state_machine.py:
$ python3 scripts/detect_state_machine.py [--json] <binario>
El plugin implementa varias heurísticas de detección para detectar diferentes construcciones de código. A continuación, describimos brevemente las heurísticas individuales y explicamos su uso.
La heurística de bloque básico grande identifica el 10% superior de las funciones con el mayor número promedio de instrucciones por bloque básico. Permite detectar
La heurística de función compleja identifica el 10% superior de las funciones con los grafos de flujo de control más complejos (basado en la complejidad ciclomática). Permite identificar
La heurística de máquina de Estado utiliza propiedades de teoría de grafos para identificar funciones que implementan máquinas de estado. Por lo general, dichas máquinas de estado se pueden representar como declaraciones switch que se despachan en un bucle. La heurística permite identificar
La heurística de secuencia de instrucción poco común realiza un análisis estadístico para identificar el 10% superior de las funciones cuyos patrones de código se desvían de una verdad fundamental precomputada. De esta manera, la heurística permite identificar
La heurística de instrucción superpuesta identifica funciones con instrucciones desalineadas (bytes de instrucción compartidos por dos instrucciones diferentes). La heurística identifica
Si la heurística se utiliza en la interfaz de usuario de Binary Ninja, las instrucciones superpuestas también se resaltan en la vista de grafo.
La heurística de función más llamada identifica el 10% superior de las funciones con el mayor número de llamadas desde diferentes funciones. De esta manera, la heurística puede identificar
La heurística identifica funciones con un alto número de bucles. Este tipo de funciones podrían implementar
La heurística también ayuda a señalar posibles cuellos de botella de rendimiento.
La heurística identifica funciones con estructuras de bucle raras y complejas que generalmente sugieren
La heurística identifica funciones que realizan una operación XOR con una constante dentro de un bucle. De esta manera, la heurística puede identificar
La heurística identifica funciones en las que las expresiones tienen más de una operación aritmética y una operación booleana simultáneamente. De esta manera, la heurística puede identificar
La heurística utiliza un enfoque de hashing de contexto iterativo para detectar estructuras repetidas de múltiples bloques dentro del grafo de flujo de control de cada función. Al comparar la firma de opcode de cada bloque junto con las firmas de sus sucesores, la heurística identifica subgrafos que están duplicados o casi duplicados en una sola función. Esto ayuda a señalar:
El plugin también incluye utilidades más específicas para funciones y regiones de código interesantes. Están disponibles en el submenú Utils; el comando All las ejecuta junto con las heurísticas más amplias.
Esta utilidad identifica funciones sin llamadores conocidos. Estas funciones podrían ser
Esta utilidad identifica funciones que no llaman a otras funciones. Estos tipos de funciones pueden ser, por ejemplo, funciones que
Esta utilidad identifica funciones recursivas—funciones que se llaman a sí mismas directa o indirectamente. Las funciones recursivas pueden indicar:
Esta utilidad evalúa la entropía de cada sección. La entropía es una medida estadística de aleatoriedad con valores que van de 0 a 8. Las secciones con una entropía cercana a 8 indican un alto grado de aleatoriedad y pueden sugerir:
Esta utilidad detecta posibles implementaciones del algoritmo RC4 mediante el empleo de marcadores heurísticos típicamente asociados con el Algoritmo de Programación de Claves (KSA) de RC4 y el Algoritmo de Generación Pseudoaleatoria (PRGA). RC4 se usa ampliamente en malware para fines como:
Para más información, contacte a @mr_phrazer.