Ruta simbólica que se fusiona en el rastro de manticore de bits blog localizador de la oficina de seguridad social

Nuestro primer informe es de Vaibhav Sharma (@vbsharma), un estudiante de doctorado en la Universidad de Minnesota. La investigación de Vaibhav se centra en mejorar los ejecutores simbólicos y se tomó una molestia al presentar una nueva optimización a Manticore: la ruta simbólica que se fusiona en Manticore

Mi proyecto consistía en investigar el uso de técnicas de combinación de caminos en Manticore, un motor de ejecución simbólico que admite la exploración simbólica de binarios compilados para las plataformas X86, X64 y Ethereum. Una barrera importante para la exploración simbólica de muchos programas prácticos es la explosión del camino. Como un ejecutor simbólico explora un programa, encuentra instrucciones de la sucursal con dos lados posibles de la discapacidad de la seguridad social. El ejecutor simbólico necesita explorar ambos lados de la instrucción de rama. Manticore explora estas instrucciones de bifurcación forzando el camino que llegó a la instrucción de bifurcación en dos caminos, cada uno de los cuales explora un lado factible. Un aumento lineal en el número de instrucciones de bifurcación con ambos lados factibles provoca un aumento exponencial en el número de caminos que Manticore necesita explorar a través del programa. Si alcanzamos una cantidad suficiente de estas condiciones de rama, Manticore nunca podrá terminar de explorar todos los estados.

La fusión de rutas reduce el número de rutas a explorar. La idea central es combinar rutas en la misma ubicación del programa que sean similares. Manticore utiliza la noción de un objeto “estado” para capturar el procesador: la información de la seguridad social, la memoria y el sistema de archivos en una sola estructura de datos en cada punto de exploración simbólica a través de un programa. Por lo tanto, la fusión de rutas se puede especializar para “fusionar estados” en Manticore, donde la fusión de estados similares que se encuentran en la misma ubicación del programa conduce a una reducción exponencial en el número de rutas a explorar. Con un programa simple, observé que Manticore podría reducir su número de rutas de ejecución exploradas en un 33% si fusionaba estados similares en la misma ubicación del programa.

La fusión de estados se puede implementar de forma estática o dinámica. La fusión de estados estáticos explora el gráfico de flujo de control del programa en cuestión en orden topológico y fusiona los estados en el nuevo plan de seguridad social en la misma ubicación del programa cuando sea posible. Veritesting es una técnica de combinación de rutas que es similar a la fusión de estados estáticos, requiere que las rutas estén en la misma ubicación del programa para combinarlas. La fusión dinámica de estados no requiere que dos estados estén en la misma ubicación del programa para que se los considere para fusionar la solicitud de la tarjeta de seguridad social. Dados dos estados a1, a2 en diferentes ubicaciones de programa l1, l2 respectivamente, si un sucesor transitivo a1 ‘de a1 tiene una similitud alta y beneficiosa con a2, el estado dinámico se fusiona rápidamente a1 a a1’ y lo combina con a2. El avance rápido implica anular la heurística de búsqueda del ejecutor simbólico para llegar a l2. La fusión dinámica de estados usa la intuición de que si dos estados son similares, es probable que sus sucesores en unos pocos pasos también sean similares.

Si bien es posible implementar cualquiera de las técnicas de fusión de estados en Manticore, elegí la fusión de estados dinámicos según lo descrito por Kuznetsov et al. como un mejor ajuste para el uso de Manticore de ejecutores simbólicos basados ​​en estado en lugar de basados ​​en ruta. Además, la fusión de estado estático es menos adecuada para la exploración simbólica guiada hacia un objetivo y más adecuada para la exploración exhaustiva de un programa temático. Dado que la fusión estática del estado solo puede combinar estados en la misma ubicación del programa, cuando se dirige hacia una meta, tiende a cubrir menos código que la fusión del estado dinámico en el mismo presupuesto de tiempo. Esta fue también una conclusión de Kuznetsov et al (vea la Figura 8 de su documento sobre cuándo tomar el seguro social a continuación). Dado que a menudo tendemos a utilizar la ejecución simbólica para alcanzar un objetivo de exploración, la fusión estática del estado es menos adecuada para nuestras necesidades.

Tanto la fusión de estado estática como la dinámica requieren el uso de una herramienta de análisis estático externo como Binary Ninja para encontrar el orden topológico de las ubicaciones de los programas. Dada la corta duración de mi aventura, elegí implementar la fusión de estados oportunistas que solo fusiona los estados que se encuentran en la misma ubicación del programa. Si bien este enfoque no ofrece todos los beneficios de la fusión dinámica de estados, es más fácil de implementar porque no se basa en la integración con una herramienta de análisis estático externo para obtener un orden topológico. Este enfoque también es fácilmente extensible a la fusión dinámica de estados, ya que utiliza muchas de las mismas operaciones primitivas como la comparación de estado de la cantidad de discapacidad de la seguridad social y la fusión de estados. Implementación

Implementé el estado oportunista fusionando para Manticore. La implementación verifica si dos estados en la misma ubicación del programa tienen entradas semánticamente equivalentes, buffers de fraude de discapacidad de seguridad social de socket de salida, memoria y rastreos de llamadas del sistema en un predicado “esMergeable”. Si se satisface este predicado, la implementación fusiona valores de registro de CPU que son semánticamente desiguales. Resultados

Los dos bloques básicos resaltados en rojo hacen que el flujo de control se fusione en el bloque básico resaltado en verde. El primer bloque rojo resaltado hace que el flujo de control salte directamente al bloque verde. El segundo bloque rojo resaltado mueve una constante (0x4a12dd) al registro edi y luego salta al bloque verde. Para explorar este ejemplo, Manticore crea dos estados, uno que explora el primer bloque rojo y salta al bloque verde, y otro estado que explora el segundo bloque rojo y salta al bloque verde. Debido a que la única diferencia entre estos dos estados que se encuentran en el mismo lugar que el programa de seguridad social de medicare (el bloque verde) es el valor presente en su registro edi, Manticore puede combinar estos dos estados en un solo estado con el valor para que edi se establezca. una expresión si-entonces-si no. Esta expresión if-then-else usará la condición que elige qué lado de la rama (jbe 0x40060d) se toma. Si se cumple la condición, la expresión if-then-else evaluará el valor que está presente en edi en el primer bloque rojo. Si la condición no se cumple, se evaluará a 0x4a12dd (la planificación de seguridad social establecida constantemente en el segundo bloque rojo). Por lo tanto, Manticore fusiona dos rutas de flujo de control en una ruta de manera oportunista, lo que finalmente lleva a Manticore a reducir su número de rutas de ejecución en un 33% en el binario compilado con la opción de optimización -Os con gcc y en un 20% si el binario se compila con el – Opción de optimización O3.

• Compruebe si los nuevos datos simbólicos introducidos por la fusión de estados causan más ramificaciones más adelante durante la exploración. Necesitamos implementar heurísticas de reinterpretación como la estimación de recuento de consultas de Kuznetsov et al. de modo que podamos usar la combinación de estados dinámicos solo cuando sea más útil.

La fusión de rutas es una técnica que necesita ser reinterpretada para adaptarse a las necesidades de un ejecutor simbólico. Esta aventura me permitió comprender el funcionamiento interno y social de Manticore, un ejecutor simbólico basado en el estado, y reinterpretar la combinación de rutas para adaptarse mejor al caso de uso de la ejecución simbólica binaria con Manticore. Mi implementación de la fusión de estados oportunistas fusiona estados similares si se encuentran en la misma ubicación del programa. La implementación se puede utilizar en un script de Python registrando un complemento llamado Merger with Manticore. basic_statemerging.py bajo examples / script es un ejemplo de dicho uso de la fusión de estados.