
SAFE: Embeddings de Função Auto-Atentivos para Similaridade Binária
Este software é o resultado da nossa pesquisa acadêmica. Veja nosso artigo no arXiv: arxiv
Se você usar este código, por favor, cite nosso artigo 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}
}
Você precisa ter o radare2 instalado no seu sistema.
Para criar o embedding de uma função:
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
Depois de ter dois embeddings embedding_x e embedding_y você pode calcular a similaridade das funções correspondentes como:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE precisa de poucas informações para funcionar. Duas são essenciais: um modelo que diz ao SAFE como converter instruções de assembly em vetores (modelo i2v) e um modelo que diz ao SAFE como converter uma função binária em um vetor. Ambos os modelos podem ser baixados usando o comando
./download_model.sh
o downloader baixa o modelo e o coloca no diretório data. A árvore de diretórios após o download deve ser:
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
O arquivo safe.pb contém o modelo SAFE usado para converter funções binárias em vetores. A pasta i2v contém o modelo i2v.
Esta seção contém detalhes necessários para replicar nossos experimentos. Se você é um usuário do SAFE, pode pular.
Este é o modelo treinado do TensorFlow congelado para a arquitetura AMD64. Você pode importá-lo em seu projeto 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)
veja o arquivo: neural_network/SAFEEmbedder.py
A pasta i2v contém dois arquivos. Uma Matriz onde cada linha é o embedding de uma instrução asm. Um arquivo json que contém um dicionário mapeando instruções asm para números de linhas da matriz acima. veja o arquivo: asm_embedding/InstructionsConverter.py
Se você quiser treinar o modelo usando nossos conjuntos de dados, primeiro use:
python3 downloader.py -td
Isso baixará os conjuntos de dados para a pasta data. Observe que os conjuntos de dados estão compactados, então você mesmo precisa descompactá-los. Esses dados serão bancos de dados sqlite. Para iniciar o treinamento, use neural_network/train.sh. O banco de dados pode ser selecionado alterando o parâmetro em train.sh. Se você quiser informações sobre o conjunto de dados, veja nosso artigo.
Se você quiser criar seu próprio conjunto de dados, pode usar o script ExperimentUtil na pasta dataset creation.
Se você quiser usar o mecanismo de busca de código binário SAFE, pode usar o script ExperimentUtil para criar a base de conhecimento. Depois, você pode pesquisar nela usando o script na pasta function_search.
Em nosso código, usamos godown para baixar dados do Google Drive. Agradecemos a circulosmeos, o criador do godown.
Agradecemos a Davide Italiano pelas discussões úteis.