
このソフトウェアは当研究の成果です。arXiv論文をご参照ください: arxiv
このコードをご利用の際は、以下のように当論文を引用してください:
@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}
}
システムに radare2 がインストールされている必要があります。
関数の埋め込みを作成するには:
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
2つの埋め込み embedding_x と embedding_y があれば、以下のように対応する関数の類似度を計算できます:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFEが動作するにはいくつかの情報が必要です。特に重要なのは、アセンブリ命令をベクトルに変換する方法をSAFEに指示するモデル (i2vモデル) と、バイナリ関数をベクトルに変換する方法を指示するモデルです。 両方のモデルは以下のコマンドでダウンロードできます
./download_model.sh
ダウンローダーはモデルをダウンロードし、dataディレクトリに配置します。 ダウンロード後のディレクトリ構成は以下のようになります。
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
safe.pbファイルには、バイナリ関数をベクトルに変換するために使用されるsafeモデルが含まれています。 i2vフォルダにはi2vモデルが含まれています。
このセクションには、実験を再現するために必要な詳細が含まれています。SAFEのユーザーであればスキップしても構いません。
これはAMD64アーキテクチャ用のフリーズされたTensorFlowトレーニング済みモデルです。以下のようにプロジェクトにインポートできます:
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)
参照ファイル: neural_network/SAFEEmbedder.py
i2vフォルダには2つのファイルが含まれています。 各行がアセンブリ命令の埋め込みである行列。 アセンブリ命令を上記行列の行番号にマッピングする辞書を含むJSONファイル。 参照ファイル: asm_embedding/InstructionsConverter.py
当データセットを使用してモデルをトレーニングするには、まず以下を実行してください:
python3 downloader.py -td
これによりデータセットがdataフォルダにダウンロードされます。データセットは圧縮されているため、ご自身で解凍する必要があります。 このデータはsqliteデータベースになります。 トレーニングを開始するには、neural_network/train.shを使用します。 train.shのパラメータを変更することで、使用するデータベースを選択できます。 データセットの詳細については、当論文を参照してください。
独自のデータセットを作成したい場合は、dataset creationフォルダ内のスクリプトExperimentUtilを使用できます。
SAFEバイナリコード検索エンジンを使用する場合は、スクリプトExperimentUtilを使用して知識ベースを作成できます。 その後、function_search内のスクリプトを使用して検索できます。
当コードでは、Google Driveからのデータダウンロードに godown を使用しています。Godownの作成者であるcirculosmeosに感謝します。
有用な議論をしてくれたDavide Italianoに感謝します。