
SAFE: Self-Attentive Function Embeddings per similarità binaria
Questo software è il risultato della nostra ricerca accademica. Vedi il nostro articolo su arXiv: arxiv
Se utilizzi questo codice, ti preghiamo di citare il nostro articolo accademico come:
@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}
}
Devi avere radare2 installato nel tuo sistema.
Per creare l'embedding di una funzione:
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 volta che hai due embedding embedding_x e embedding_y, puoi calcolare la similarità delle funzioni corrispondenti come:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE ha bisogno di poche informazioni per funzionare. Due sono essenziali: un modello che dice a SAFE come convertire le istruzioni assembly in vettori (modello i2v) e un modello che dice a SAFE come convertire una funzione binaria in un vettore. Entrambi i modelli possono essere scaricati usando il comando
./download_model.sh
il downloader scarica i modelli e li posiziona nella directory data. L'albero delle directory dopo il download dovrebbe essere:
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
Il file safe.pb contiene il modello SAFE utilizzato per convertire funzioni binarie in vettori. La cartella i2v contiene il modello i2v.
Questa sezione contiene dettagli necessari per replicare i nostri esperimenti. Se sei un utente di SAFE, puoi saltarla.
Questo è il modello TensorFlow congelato addestrato per l'architettura AMD64. Puoi importarlo nel tuo progetto 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)
vedi file: neural_network/SAFEEmbedder.py
La cartella i2v contiene due file. Una matrice in cui ogni riga è l'embedding di un'istruzione assembly. Un file JSON che contiene un dizionario che mappa le istruzioni assembly in numeri di riga della matrice sopra. vedi file: asm_embedding/InstructionsConverter.py
Se vuoi addestrare il modello usando i nostri dataset, devi prima usare:
python3 downloader.py -td
Questo scaricherà i dataset nella cartella data. Nota che i dataset sono compressi, quindi devi decomprimerli tu stesso. Questi dati saranno database SQLite. Per avviare l'addestramento usa neural_network/train.sh. Il database può essere selezionato cambiando il parametro in train.sh. Se vuoi informazioni sul dataset, consulta il nostro articolo.
Se vuoi creare il tuo dataset, puoi usare lo script ExperimentUtil nella cartella dataset creation.
Se vuoi utilizzare il motore di ricerca di codice binario SAFE, puoi usare lo script ExperimentUtil per creare la knowledge base. Poi puoi cercare al suo interno usando lo script in function_search.
Nel nostro codice utilizziamo godown per scaricare dati da Google Drive. Ringraziamo circulosmeos, il creatore di godown.
Ringraziamo Davide Italiano per le utili discussioni.