
SAFE: 이진 유사도를 위한 자기 주의 함수 임베딩
이 소프트웨어는 학술 연구의 결과물입니다. 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
두 개의 임베딩 embedding_x와 embedding_y가 있으면, 다음과 같이 해당 함수의 유사도를 계산할 수 있습니다:
from sklearn.metrics.pairwise import cosine_similarity
sim=cosine_similarity(embedding_x, embedding_y)
SAFE는 작동을 위해 약간의 정보가 필요합니다. 두 가지가 필수적입니다. 어셈블리 명령어를 벡터로 변환하는 방법을 SAFE에 알려주는 모델(i2v 모델)과 이진 함수를 벡터로 변환하는 방법을 SAFE에 알려주는 모델입니다. 두 모델은 다음 명령어로 다운로드할 수 있습니다
./download_model.sh
다운로더가 모델을 다운로드하여 data 디렉터리에 배치합니다. 다운로드 후 디렉터리 트리는 다음과 같아야 합니다.
safe/-- githubcode
\
\--data/-----safe.pb
\
\---i2v/
safe.pb 파일에는 이진 함수를 벡터로 변환하는 데 사용되는 safe-model이 포함되어 있습니다. i2v 폴더에는 i2v 모델이 포함되어 있습니다.
이 섹션에는 실험을 재현하는 데 필요한 세부 사항이 포함되어 있습니다. SAFE 사용자라면 건너뛰셔도 됩니다.
이것은 AMD64 아키텍처용으로 학습된 frozen 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 폴더에는 두 개의 파일이 포함되어 있습니다. 각 행이 어셈블리 명령어의 임베딩인 행렬. 위 행렬의 행 번호로 어셈블리 명령어를 매핑하는 사전이 포함된 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에게 감사드립니다.