Spedi adalah disassembler spekulatif untuk Thumb ISA ukuran variabel. Dengan adanya file ELF sebagai masukan, Spedi dapat:
Spedi bekerja langsung pada biner tanpa menggunakan informasi simbol. Kami menemukan Spedi mengungguli IDA Pro dalam eksperimen kami.
Spedi memulihkan semua kemungkinan Blok Dasar (BB) yang tersedia dalam biner. BB yang berbagi instruksi lompat yang sama dikelompokkan dalam satu Blok Maksimal (MB). Kemudian, MB disempurnakan menggunakan analisis konflik yang tumpang tindih dan CFG. Detailnya dapat ditemukan di makalah CASES'16 kami " Pembongkaran spekulatif kode biner ". Makalahnya tersedia di sini.
Spedi (hampir) memulihkan instruksi perakitan dengan sempurna dari biner benchmark kami dengan rata-rata 99,96%. Sebagai perbandingan, IDA Pro memiliki rata-rata 95,83% yang dipengaruhi oleh kinerja yang relatif buruk pada benchmark sha .
Spedi secara tepat memulihkan rata-rata 97,46% fungsi. Artinya, ini mengidentifikasi alamat awal dan alamat akhir yang benar. Bandingkan dengan rata-rata 40,53% yang dicapai oleh IDA Pro.
Properti bagus dari teknik kami adalah kecepatannya dan skalanya baik dengan peningkatan ukuran benchmark. Misalnya, spedi membongkar du (instruksi 50K) dalam waktu sekitar 150 ms. Perhatikan bahwa ada ruang bagus untuk pengoptimalan lebih lanjut.
Untuk mengutip Spedi dalam karya akademis silakan gunakan:
@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},
}
Bangun proyek dan coba di salah satu binari di rangkaian benchmark kami yang tersedia di repositori ini.
Perintah berikut akan menginstruksikan spedi
untuk membongkar bagian .text
secara spekulatif,
$ ./spedi -t -s -f $FILE > speculative.inst
Gunakan perintah berikut untuk membongkar bagian .text
berdasarkan simbol pemetaan kode ARM yang memberikan kebenaran dasar tentang instruksi yang benar,
$ ./spedi -t -f $FILE > correct.inst
Cara termudah untuk membandingkan kedua keluaran adalah dengan menggunakan,
$ diff -y correct.inst speculative.inst | less
Saat ini, Anda perlu memodifikasi main.cpp
secara manual untuk menampilkan hasil yang terkait dengan tabel peralihan dan pemulihan grafik panggilan.
Alat ini adalah bukti konsep akademis. Saat ini, hal tersebut tidak ada dalam daftar prioritas kami. Namun ada beberapa fitur tertentu yang kami rencanakan untuk masa depan, yaitu:
bx
dan blx
) harus dianalisis. Makalah ini memberikan beberapa rincian terkait. Baru-baru ini, Andriesse dkk. al. telah mengerjakan Nucleus
, alat untuk identifikasi fungsi dalam biner x64. Makalah mereka " Deteksi Fungsi Agnostik Kompiler dalam Biner " diterima di IEEE Euro S&P 2017. Mereka menggunakan teknik identifikasi fungsi yang kurang lebih sama yang diterapkan di Spedi. Jika Anda tertarik dengan dukungan x64, Anda dapat melihat alatnya.
Namun perlu diperhatikan bahwa alat mereka didasarkan pada asumsi bahwa kompiler x64 terbaru mengalokasikan data tabel lompat di bagian .rodata
. Hal ini membuat pemulihan instruksi jauh lebih mudah karena dapat dilakukan secara andal dengan sapuan linier. Sebagai perbandingan, Spedi menangani kasus yang lebih umum dari kode/data campuran menggunakan pembongkaran spekulatif.
Proyek ini bergantung pada perpustakaan pembongkaran Capstone (v3.0.4).