
SAFE : Self-Attentive Function Embeddings pour la similarité binaire
Ce logiciel est le résultat de notre recherche académique. Consultez notre article arXiv : arxiv
Si vous utilisez ce code, veuillez citer notre article académique comme suit :
@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}
}
Vous devez avoir radare2 installé sur votre système.
Pour créer le plongement d'une fonction :
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
Une fois que vous avez deux plongements embedding_x et embedding_y, vous pouvez calculer la similarité des fonctions correspondantes comme suit :
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE a besoin de peu d'informations pour fonctionner. Deux sont essentielles : un modèle qui indique à safe comment convertir les instructions assembleur en vecteurs (modèle i2v) et un modèle qui indique à safe comment convertir une fonction binaire en vecteur. Les deux modèles peuvent être téléchargés en utilisant la commande
./download_model.sh
le téléchargeur télécharge le modèle et les place dans le répertoire data. L'arborescence des répertoires après le téléchargement devrait être la suivante.
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
Le fichier safe.pb contient le modèle safe utilisé pour convertir les fonctions binaires en vecteurs. Le dossier i2v contient le modèle i2v.
Cette section contient les détails nécessaires pour reproduire nos expériences. Si vous êtes un utilisateur de safe, vous pouvez ignorer cette section.
Il s'agit du modèle tensorflow gelé entraîné pour l'architecture AMD64. Vous pouvez l'importer dans votre projet en utilisant :
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)
voir le fichier : neural_network/SAFEEmbedder.py
Le dossier i2v contient deux fichiers. Une matrice où chaque ligne est le plongement d'une instruction asm. Un fichier json qui contient un dictionnaire mappant les instructions asm vers les numéros de lignes de la matrice ci-dessus. voir le fichier : asm_embedding/InstructionsConverter.py
Si vous souhaitez entraîner le modèle en utilisant nos jeux de données, vous devez d'abord utiliser :
python3 downloader.py -td
Cela téléchargera les jeux de données dans le dossier data. Notez que les jeux de données sont compressés, vous devez donc les décompresser vous-même. Ces données seront des bases de données sqlite. Pour lancer l'entraînement, utilisez neural_network/train.sh. La base de données peut être sélectionnée en modifiant le paramètre dans train.sh. Pour plus d'informations sur les jeux de données, consultez notre article.
Si vous souhaitez créer votre propre jeu de données, vous pouvez utiliser le script ExperimentUtil dans le dossier dataset creation.
Si vous souhaitez utiliser le moteur de recherche de code binaire SAFE, vous pouvez utiliser le script ExperimentUtil pour créer la base de connaissances. Ensuite, vous pouvez effectuer des recherches à l'aide du script dans function_search
Dans notre code, nous utilisons godown pour télécharger des données depuis Google Drive. Nous remercions circulosmeos, le créateur de godown.
Nous remercions Davide Italiano pour les discussions utiles.