Ddisasm adalah disassembler cepat yang cukup akurat untuk kode perakitan yang dihasilkan untuk disusun kembali. DDISASM diimplementasikan menggunakan bahasa pemrograman logika deklaratif Datalog (Souffle) untuk menyusun aturan dan heuristik pembongkaran. Disassembler First Parses ELF/PE File Informasi dan mendekode superset instruksi yang mungkin untuk membuat set awal fakta datalog. Fakta -fakta ini dianalisis untuk mengidentifikasi lokasi kode , simbolisasi , dan batas fungsi . Hasil analisis ini, serangkaian fakta datalog yang disempurnakan, kemudian diterjemahkan ke representasi perantara GTIRB untuk analisis biner dan rekayasa balik. Printer cantik GTIRB kemudian dapat digunakan untuk mencetak GTIRB dengan cukup kode perakitan yang dapat dipasang kembali.
Format biner:
Instruksi Set Arsitektur (ISAS):
Anda dapat menjalankan versi prebuilt dari ddisasm menggunakan Docker:
docker pull grammatech/ddisasm:latestDdisasm dapat digunakan untuk membongkar biner ke dalam representasi GTIRB. Kita dapat mencobanya dengan salah satu contoh yang termasuk dalam repositori.
Pertama, mulailah wadah Ddisasm Docker:
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestDi dalam wadah Docker, mari kita bangun salah satu contoh:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o exSekarang kita dapat melanjutkan untuk membongkar biner:
ddisasm ex --ir ex.gtirbSetelah Anda memiliki representasi GTIRB, Anda dapat membuat perubahan terprogram pada biner menggunakan GTIRB atau GTIRB-rewriting.
Kemudian, Anda dapat menggunakan GTIRB-PPRINTER (termasuk dalam gambar Docker) untuk menghasilkan versi baru biner:
gtirb-pprinter ex.gtirb -b ex_rewritten
Secara internal, gtirb-pprinter akan menghasilkan file perakitan dan memohon kompiler/assembler (misalnya GCC) untuk menghasilkan biner baru. gtirb-pprinter akan berhati-hati atau menghasilkan semua opsi baris perintah yang diperlukan untuk menghasilkan biner baru, termasuk opsi kompilasi, dependensi perpustakaan, atau skrip linker versi.
Anda juga dapat menggunakan gtirb-pprinter untuk menghasilkan daftar perakitan untuk modifikasi manual:
gtirb-pprinter ex.gtirb --asm ex.sDaftar perakitan ini kemudian dapat dikompilasi ulang secara manual:
gcc -nostartfiles ex.s -o ex_rewrittenSilakan lihat dokumentasi kami untuk informasi tambahan.
Lihat 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}
}