Spedi는 가변 크기 Thumb ISA용 추측성 디스어셈블러입니다. ELF 파일을 입력으로 지정하면 Spedi는 다음을 수행할 수 있습니다.
Spedi는 기호 정보를 사용하지 않고 바이너리에서 직접 작동합니다. 우리는 실험에서 Spedi가 IDA Pro보다 뛰어난 성능을 보인다는 사실을 발견했습니다.
Spedi는 바이너리에서 사용 가능한 모든 기본 블록(BB)을 복구합니다. 동일한 점프 명령을 공유하는 BB는 하나의 최대 블록(MB)으로 그룹화됩니다. 그런 다음 중첩 및 CFG 충돌 분석을 사용하여 MB를 정제합니다. 자세한 내용은 CASES'16 논문 " 이진 코드의 추측적 분해 "에서 확인할 수 있습니다. 해당 논문은 여기에서 확인하실 수 있습니다.
Spedi는 (거의) 평균 99.96%로 벤치마크 바이너리에서 어셈블리 지침을 완벽하게 복구합니다. 이에 비해 IDA Pro는 sha 벤치마크의 상대적으로 낮은 성능으로 인해 평균 95.83%의 왜곡이 발생했습니다.
Spedi는 평균 97.46%의 기능을 정확하게 복구합니다. 즉, 올바른 시작 주소와 끝 주소를 식별합니다. 이를 IDA Pro의 평균 40.53%와 비교해 보세요.
우리 기술의 좋은 특성은 속도가 빠르고 벤치마크 크기가 증가함에 따라 확장이 잘 된다는 것입니다. 예를 들어 spedi는 약 150ms 안에 du (50K 명령어)를 분해합니다. 추가 최적화의 여지가 있다는 점에 유의하세요.
학술 연구에서 Spedi를 인용하려면 다음을 사용하십시오.
@inproceedings{BenKhadraSK2016,
author = {Ben Khadra, M. Ammar and Stoffel, Dominik and Kunz, Wolfgang},
title = {Speculative Disassembly of Binary Code},
booktitle = {Proceedings of the International Conference on Compilers, Architectures and Synthesis for Embedded Systems},
year = {2016},
location = {Pittsburgh, Pennsylvania},
articleno = {16},
doi = {10.1145/2968455.2968505},
acmid = {2968505},
publisher = {ACM},
}
프로젝트를 빌드하고 이 저장소에서 사용할 수 있는 벤치마크 제품군의 바이너리 중 하나에서 사용해 보세요.
다음 명령은 spedi
.text
섹션을 추론적으로 분해하도록 지시합니다.
$ ./spedi -t -s -f $FILE > speculative.inst
다음 명령을 사용하여 올바른 명령에 대한 실제 정보를 제공하는 ARM 코드 매핑 기호를 기반으로 .text
섹션을 디스어셈블합니다.
$ ./spedi -t -f $FILE > correct.inst
두 출력을 비교하는 가장 쉬운 방법은 다음을 사용하는 것입니다.
$ diff -y correct.inst speculative.inst | less
현재 스위치 테이블 및 호출 그래프 복구와 관련된 결과를 표시하려면 main.cpp
수동으로 수정해야 합니다.
이 도구는 학문적 개념 증명입니다. 현재는 우리의 우선순위 목록에 없습니다. 그러나 미래를 위해 우리가 염두에 두고 있는 특정 기능은 다음과 같습니다.
bx
및 blx
)을 분석해야 합니다. 이 문서에서는 몇 가지 관련 세부 정보를 제공합니다. 최근 Andriesse et. 알. x64 바이너리의 기능 식별 도구인 Nucleus
작업을 해왔습니다. 그들의 논문 " 바이너리의 컴파일러 독립적 기능 감지 "는 IEEE Euro S&P 2017에서 승인되었습니다. 그들은 Spedi에서 구현된 기능 식별 기술과 거의 동일한 기능을 사용합니다. x64 지원에 관심이 있다면 해당 도구를 살펴보세요.
그러나 해당 도구는 최근 x64 컴파일러가 .rodata
섹션에 점프 테이블 데이터를 할당한다는 가정을 기반으로 합니다. 선형 스윕을 사용하여 안정적으로 수행할 수 있으므로 명령어 복구가 훨씬 쉬워집니다. 이에 비해 Spedi는 추측적 분해를 사용하여 혼합 코드/데이터의 보다 일반적인 경우를 처리합니다.
이 프로젝트는 Capstone 디스어셈블리 라이브러리(v3.0.4)에 의존합니다.