2 puntos por GN⁺ 2024-03-18 | 1 comentarios | Compartir por WhatsApp
  • Ingeniería inversa con modelos de lenguaje de gran escala

1. Introducción a LLM4Decompile y Decompile-Eval

  • Nuestro objetivo es crear y lanzar el primer LLM de código abierto dedicado a la descompilación, y construir el primer benchmark de descompilación enfocado en la recompilabilidad y la reejecutabilidad para evaluar sus capacidades.
  • Se recopilaron un millón de muestras de código C de AnghaBench y se compilaron a código ensamblador usando GCC, con lo que se construyó un dataset de 4 mil millones de tokens de pares ensamblador-código fuente.
  • Con este dataset, se ajustó finamente el modelo DeepSeek-Coder, un LLM líder para código, y se construyó Decompile-Eval como benchmark de evaluación basado en preguntas de HumanEval y muestras de prueba.
  • La evaluación se realiza desde dos perspectivas: si el código descompilado puede recompilarse con éxito y si puede pasar todas las aserciones de los casos de prueba.

2. Resultados de la evaluación

Métricas

  • La recompilabilidad y la reejecutabilidad son indicadores importantes para verificar la efectividad del proceso de descompilación.
  • Si el código descompilado puede recompilarse, esto proporciona una fuerte evidencia de integridad sintáctica.
  • Como la sintaxis por sí sola no garantiza que sea semánticamente idéntico al programa original, la reejecutabilidad es una medida clave para evaluar la precisión semántica.
  • La recompilabilidad y la reejecutabilidad representan la recuperación sintáctica y la preservación semántica, elementos esenciales para una descompilación útil y robusta.

3. Cómo usar el modelo

  • LLM4Decompile incluye modelos con entre 1.3 y 33 mil millones de parámetros, disponibles en Hugging Face.
  • Ejemplos de modelos: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
  • El modelo NSP fue entrenado con código ensamblador y su reejecutabilidad promedio es de aproximadamente 0.17.
  • El modelo UO fue entrenado sin conocimiento previo del nivel de optimización (O0~O3) y su reejecutabilidad promedio es de aproximadamente 0.21.
  • Ejemplo de uso del modelo: compilar código C a binario, desensamblar el binario en instrucciones ensamblador y usar LLM4Decompile para traducir las instrucciones ensamblador a C.

4. Cómo usar Decompile-Eval

  • Los datos están almacenados como una lista JSON en llm4decompile/decompile-eval/decompile-eval.json.
  • Se ofrecen métodos para ejecutar la evaluación en una sola GPU y un solo proceso, así como usando TGI (10 veces más rápido, con soporte para múltiples GPU y multiproceso).

5. En progreso

  • LLM4Binary: se planea incluir un dataset más grande para preentrenar el modelo con código ensamblador y código C.
  • Decompiler-ALL: se planea ampliar el soporte a más lenguajes/plataformas y configuraciones (por ejemplo, descompilación de múltiples funciones).

6. Licencia

  • Licencia MIT

Opinión de GN⁺

  • LLM4Decompile propone un enfoque innovador frente a los métodos tradicionales de descompilación binaria, especialmente al aprovechar modelos de lenguaje de gran escala para hacer posible una descompilación más precisa y eficiente.
  • Esta tecnología puede ser muy útil en el campo de la seguridad de software, y podría ayudar en el análisis de malware o el mantenimiento de sistemas heredados.
  • El hecho de que la reejecutabilidad del código descompilado no sea perfecta sugiere que esta tecnología todavía tiene margen de mejora. Se necesita más investigación para aumentar la precisión y la eficiencia en entornos reales.
  • Entre las herramientas existentes con funciones similares están descompiladores comerciales y de código abierto como Ghidra o IDA Pro, pero LLM4Decompile ofrece un nuevo enfoque basado en machine learning.
  • Al adoptar esta tecnología, es necesario considerar la calidad y el alcance de los datos de entrenamiento, la precisión del modelo y la velocidad de ejecución. Sus ventajas potenciales son una alta precisión y flexibilidad, mientras que la complejidad de los modelos de gran escala y los requisitos de recursos computacionales pueden ser desventajas.

1 comentarios

 
GN⁺ 2024-03-18
Comentarios de Hacker News
  • Opinión sobre los resultados de "re-ejecutabilidad":

    • La re-ejecutabilidad es una forma importante de medir la corrección semántica. Se recompila el resultado descompilado y se ejecutan casos de prueba para evaluar si se preservaron la lógica y el comportamiento del programa. La recompilabilidad y la re-ejecutabilidad indican recuperación sintáctica y preservación semántica, lo cual es esencial para una descompilación útil y robusta.
  • Pregunta sobre la confiabilidad del resultado descompilado:

    • Es una pregunta seria si el resultado descompilado es confiable. La recompilación puede generar código máquina diferente, y puede ser difícil identificar nuevas estructuras, especialmente si forman parte del núcleo del código. Me pregunto si hay alguna forma de que un LLM reporte su nivel de confianza sobre secciones específicas durante la ejecución generativa. Parece que haría falta verificación humana.
  • Un excelente caso de uso para el ajuste fino de LLM:

    • Es un gran caso de uso para el ajuste fino de LLM, porque es fácil generar grandes datasets de pares de entrada/salida a partir de código C publicado.
  • Interés en entrenar módulos de descompilación basados en desarrolladores:

    • Es interesante si se puede entrenar un módulo de descompilación con base en aplicaciones hechas por desarrolladores específicos. Por ejemplo, Super Mario 64 y Zelda 64 ya fueron completamente descompilados, y otros juegos de N64 siguen en proceso. Me pregunto si eso podría facilitar la descompilación de otros juegos hechos por esos mismos desarrolladores.
  • Interés en el caso de uso ideal del descompilador y en la creación de datasets:

    • Un descompilador ideal eliminaría la dependencia de código fuente propietario. Gracias a la abundancia de código C disponible públicamente, sería fácil crear datasets formados por pares de ASM y código fuente.
  • Presentación de un proyecto personal de descompilador basado en LLM en curso:

    • Estoy desarrollando un descompilador basado en LLM para bytecode de Python. No hay mucha gente trabajando en esta línea de investigación, pero creo que puede volverse interesante ahora que son posibles contextos de atención largos. Si conocen un equipo con el que se pueda colaborar, me interesa.
  • Preocupación por benchmarks sin comparación con enfoques basados en IA:

    • Está bien ver distintos enfoques, pero sin una comparación con métodos no basados en IA como IDA Pro, el benchmark podría no significar mucho. Sería interesante ver cómo rinde este modelo según las métricas de artículos de seguridad.
  • Interés en la gran diferencia entre las puntuaciones de recompilabilidad y re-ejecutabilidad:

    • GPT4 logró 8x% en recompilabilidad (sintácticamente correcto), pero un pésimo 1x% en re-ejecutabilidad (conceptualmente correcto), mostrando una vez más su excesiva capacidad de imitación.
  • Curiosidad por la comparación con otros descompiladores que no son LLM:

    • Me pregunto cómo se compara con descompiladores no basados en LLM como IDA, Binja, etc. Solo veo comparaciones con otros LLM.
  • Curiosidad por que el modelo 6b haya rendido mejor que el modelo 33b:

    • Es interesante que el modelo 6b haya mostrado mejor rendimiento que el 33b. Me pregunto si el modelo 33b necesita más datos de entrenamiento. El modelo 33b fue preentrenado con alrededor de 1 millón de programas en C, mientras que DeepSeek-Coder fue entrenado con 2 billones de tokens, es decir, varios órdenes de magnitud más datos.