DDisasm은 빠른 분해체로, 결과 어셈블리 코드가 재 조립 될 수있을 정도로 정확합니다 . DDisasm은 분해 규칙 및 휴리스틱을 컴파일하기 위해 Datalog (Souffle) 선언 논리 프로그래밍 언어를 사용하여 구현됩니다. Disassembler는 먼저 ELF/PE 파일 정보를 구문 분석하고 가능한 지침의 슈퍼 설정을 사용하여 초기 데이터 로그 사실을 생성합니다. 이러한 사실은 코드 위치 , 기호화 및 기능 경계를 식별하기 위해 분석됩니다. 이 분석의 결과, 정제 된 데이터 로그 사실 세트는 이진 분석 및 역 엔지니어링을위한 GTIRB 중간 표현으로 변환됩니다. 그런 다음 GTIRB Pretty Printer를 사용하여 GTIRB를 예쁜 인쇄하여 조립 가능한 어셈블리 코드를 다시 인쇄 할 수 있습니다.
이진 형식 :
지침 세트 아키텍처 (ISAS) :
docker를 사용하여 미리 빌드 버전의 ddisasm을 실행할 수 있습니다.
docker pull grammatech/ddisasm:latestDDisasm을 사용하여 이진을 GTIRB 표현으로 분해 할 수 있습니다. 저장소에 포함 된 예 중 하나를 사용하여 시도 할 수 있습니다.
먼저 ddisasm docker 컨테이너를 시작하십시오.
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestDocker 컨테이너 내에 예제 중 하나를 작성하겠습니다.
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex이제 우리는 바이너리를 분해하기 위해 진행할 수 있습니다.
ddisasm ex --ir ex.gtirbGTIRB 표현이 있으면 GTIRB 또는 GTIRB- 레팅을 사용하여 이진을 프로그래밍 방식으로 변경할 수 있습니다.
그런 다음 gtirb-pprinter (Docker 이미지에 포함)를 사용하여 새로운 버전의 바이너리를 생성 할 수 있습니다.
gtirb-pprinter ex.gtirb -b ex_rewritten
내부적으로 gtirb-pprinter 어셈블리 파일을 생성하고 컴파일러/어셈블러 (예 : GCC)를 호출하여 새로운 바이너리를 생성합니다. gtirb-pprinter 컴파일 옵션, 라이브러리 종속성 또는 버전 링커 스크립트를 포함하여 새로운 바이너리를 생성하기 위해 필요한 모든 명령 줄 옵션을 관리하거나 생성합니다.
gtirb-pprinter 사용하여 수동 수정을위한 어셈블리 목록을 생성 할 수도 있습니다.
gtirb-pprinter ex.gtirb --asm ex.s그런 다음이 어셈블리 목록을 수동으로 다시 컴파일 할 수 있습니다.
gcc -nostartfiles ex.s -o ex_rewritten추가 정보는 문서를 살펴보십시오.
Contributing.md를 참조하십시오
@inproceedings {flores-montoya2020,
author = {Antonio Flores-Montoya and Eric Schulte},
title = {Datalog Disassembly},
booktitle = {29th USENIX Security Symposium (USENIX Security 20)},
year = {2020},
isbn = {978-1-939133-17-5},
pages = {1075--1092},
url = {https://www.usenix.org/conference/usenixsecurity20/presentation/flores-montoya},
publisher = {USENIX Association},
month = aug,
}
@misc{schulte2020gtirb,
title={GTIRB: Intermediate Representation for Binaries},
author={Eric Schulte and Jonathan Dorn and Antonio Flores-Montoya and Aaron Ballman and Tom Johnson},
year={2020},
eprint={1907.02859},
archivePrefix={arXiv},
primaryClass={cs.PL}
}