
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