XDA는 명령어를 분해하고 제거된 바이너리의 기능 경계를 복구하는 도구입니다. 이는 마스크된 언어 모델링 목표를 갖춘 Transformer 인코더를 사용한 전이 학습을 기반으로 합니다[1, 2, 3]. 이는 최첨단 도구(예: IDA Pro, Ghidra 및 양방향 RNN [4])보다 성능이 뛰어납니다. 자세한 내용은 XDA: 전이 학습을 통한 정확하고 견고한 분해 논문에서 확인하세요.
@inproceedings{pei2021xda,
title={XDA: Accurate, Robust Disassembly with Transfer Learning},
author={Pei, Kexin and Guan, Jonas and King, David Williams and Yang, Junfeng and Jana, Suman},
year={2021},
booktitle={Proceedings of the 2021 Network and Distributed System Security Symposium (NDSS)}
}
환경을 설정하고 필요한 패키지를 설치하려면 conda
사용하는 것이 좋습니다.
먼저 콘다 환경을 만들고,
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
conda 환경을 활성화합니다.
conda activate xda
그런 다음 최신 Pytorch를 설치합니다(GPU가 있다고 가정).
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
마지막으로 xda 루트 디렉터리(예: path/to/xda
를 입력하고 XDA를 설치합니다.
pip install --editable .
path/to/xda
에 checkpoints
및 checkpoints/pretrain_all
디렉터리를 생성합니다.
mkdir -p checkpoints/pretrain_all
사전 학습된 가중치 매개변수를 다운로드하고 checkpoints/pretrain_all
에 입력하세요.
또한 기능 경계 복구를 직접 수행할 수 있도록 미세 조정된 모델을 제공합니다. 미세 조정된 모델은 MSVC x64로 컴파일된 바이너리에서 학습됩니다. path/to/xda
에 checkpoints/finetune_msvs_funcbound_64
하위 디렉터리를 만듭니다.
mkdir -p checkpoints/finetune_msvs_funcbound_64
미세 조정된 가중치 매개변수를 다운로드하고 checkpoints/finetune_msvs_funcbound_64
에 입력하세요.
MSVC x64로 컴파일된 BAP 코퍼스의 일부 샘플 데이터를 data-raw/msvs_funcbound_64_bap_test
에 넣었습니다. 데이터 파일에는 두 개의 열이 있습니다. 첫 번째 열은 모두 바이너리의 원시 바이트이고, 두 번째 열은 함수 시작(F), 함수 끝(R) 또는 둘 다 아님을 나타내는 레이블입니다.
이러한 파일의 함수 경계를 예측하려면 다음을 실행하세요.
python scripts/play/play_func_bound.py
이 스크립트는 checkpoints/finetune_msvs_funcbound_64
에 넣은 미세 조정된 가중치를 로드하고 함수 경계를 예측합니다. 또한 IDA의 실제 결과 및 결과와도 비교할 것입니다.
data-src/
에서 사전 훈련 및 미세 조정에 대한 샘플 훈련/테스트 파일을 제공합니다.
data-src/pretrain_all
에는 사전 훈련을 위해 제거된 바이너리의 샘플 원시 바이트가 포함되어 있습니다.data-src/funcbound
함수 경계가 있는 샘플 원시 바이트가 포함되어 있습니다. 우리는 이미 수많은 바이너리에 대해 사전 훈련된 모델을 제공했습니다. 그러나 자체적으로 수집된 데이터를 사전 훈련하려는 경우 data-src/pretrain_all
의 형식과 유사한 샘플 파일을 준비할 수 있습니다(모든 바이너리의 모든 바이트를 연결하고 줄 바꿈 n
으로 구분하여 각 줄이 모델이 허용하는 최대 길이를 초과함). 마찬가지로, 미세 조정 데이터를 직접 준비하려면 data-src/funcbound
에 표시된 형식을 따라야 합니다.
훈련할 수 있도록 데이터를 이진화해야 합니다. 사전 훈련을 위해 훈련 데이터를 이진화하려면 다음을 실행하십시오.
./scripts/pretrain/preprocess-pretrain-all.sh
사전 훈련을 위해 준비된 이진화된 훈련 데이터는 data-bin/pretrain_all
에 저장됩니다.
미세 조정을 위해 훈련 데이터를 이진화하려면 다음을 실행하십시오.
./scripts/finetune/preprocess.sh
미세 조정(함수 경계용)이 준비된 이진화된 훈련 데이터는 data-bin/funcbound
에 저장됩니다.
사전 학습을 위해 자체적으로 구문 분석된 바이너리를 사용하고 이미 data-bin/pretrain_all
에서 바이너리화한 경우 다음을 실행하세요.
./scripts/pretrain/pretrain-all.sh
모델을 미세 조정하려면 다음을 실행하세요.
./scripts/finetune/finetune.sh
스크립트는 checkpoints/pretrain_all/
에서 사전 훈련된 가중치 매개변수를 로드하고 모델을 미세 조정합니다.
birnn/
속도 평가를 위해 https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
에 스크립트를 넣었습니다.
[1] Vaswani, Ashish 등. "주의가 필요한 전부입니다." 신경 정보 처리 시스템의 발전. 2017.
[2] 데블린, 제이콥, 그 외 여러분. "Bert: 언어 이해를 위한 심층 양방향 변환기 사전 훈련." arXiv 사전 인쇄 arXiv:1810.04805 (2018).
[3] Liu, Yinhan, 그 외 여러분. "Roberta: 강력하게 최적화된 bert 사전 학습 접근 방식입니다." arXiv 사전 인쇄 arXiv:1907.11692 (2019).
[4] 신의철, Richard, Dawn Song, Reza Moazzezi. "신경망을 사용하여 바이너리의 기능을 인식합니다." 제24회 USENIX 보안 심포지엄. 2015.