
SAFE: Embeddings de funciones auto-atentivos para similitud binaria
Este software es el resultado de nuestra investigación académica. Consulte nuestro artículo en arXiv: arxiv
Si usas este código, por favor cita nuestro artículo académico como:
@inproceedings{massarelli2018safe,
title={SAFE: Self-Attentive Function Embeddings for Binary Similarity},
author={Massarelli, Luca and Di Luna, Giuseppe Antonio and Petroni, Fabio and Querzoni, Leonardo and Baldoni, Roberto},
booktitle={Proceedings of 16th Conference on Detection of Intrusions and Malware & Vulnerability Assessment (DIMVA)},
year={2019}
}
Necesitas tener radare2 instalado en tu sistema.
Para crear el embedding de una función:
git clone https://github.com/gadiluna/SAFE.git
pip install -r requirements
chmod +x download_model.sh
./download_model.sh
python safe.py -m data/safe.pb -i helloworld.o -a 100000F30
Una vez que tengas dos embeddings embedding_x y embedding_y, puedes calcular la similitud de las funciones correspondientes como:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE necesita poca información para funcionar. Dos son esenciales: un modelo que le indique a SAFE cómo convertir instrucciones ensamblador en vectores (modelo i2v) y un modelo que le indique a SAFE cómo convertir una función binaria en un vector. Ambos modelos se pueden descargar usando el comando
./download_model.sh
el descargador descarga los modelos y los coloca en el directorio data. El árbol de directorios después de la descarga debería ser.
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
El archivo safe.pb contiene el modelo safe utilizado para convertir funciones binarias en vectores. La carpeta i2v contiene el modelo i2v.
Esta sección contiene detalles necesarios para replicar nuestros experimentos. Si eres un usuario de SAFE, puedes omitirla.
Este es el modelo TensorFlow congelado entrenado para la arquitectura AMD64. Puedes importarlo en tu proyecto usando:
import tensorflow as tf
with tf.gfile.GFile("safe.pb", "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Graph().as_default() as graph:
tf.import_graph_def(graph_def)
sess = tf.Session(graph=graph)
ver archivo: neural_network/SAFEEmbedder.py
La carpeta i2v contiene dos archivos. Una matriz donde cada fila es el embedding de una instrucción asm. Un archivo json que contiene un diccionario que mapea las instrucciones asm a los números de fila de la matriz anterior. ver archivo: asm_embedding/InstructionsConverter.py
Si quieres entrenar el modelo usando nuestros conjuntos de datos, primero debes usar:
python3 downloader.py -td
Esto descargará los conjuntos de datos en la carpeta data. Ten en cuenta que los conjuntos de datos están comprimidos, por lo que debes descomprimirlos tú mismo. Estos datos serán bases de datos sqlite. Para iniciar el entrenamiento usa neural_network/train.sh. La base de datos se puede seleccionar cambiando el parámetro en train.sh. Si deseas información sobre el conjunto de datos, consulta nuestro artículo.
Si quieres crear tu propio conjunto de datos, puedes usar el script ExperimentUtil en la carpeta dataset creation.
Si quieres usar el motor de búsqueda de código binario de SAFE, puedes usar el script ExperimentUtil para crear la base de conocimiento. Luego puedes buscar en ella usando el script en function_search
En nuestro código usamos godown para descargar datos de Google Drive. Agradecemos a circulosmeos, el creador de godown.
Agradecemos a Davide Italiano por las útiles discusiones.