Retrowrite adalah penulis ulang biner statis untuk x64 dan aarch64. Ini bekerja tanpa heuristik, tidak memperkenalkan overhead dan menggunakan teknik simbolisasi (juga dikenal sebagai perakitan yang dapat dikembalikan ) untuk memasukkan instrumentasi ke binari tanpa perlu kode sumber.
Harap dicatat bahwa versi X64 dan versi ARM64 menggunakan algoritma penulisan ulang yang berbeda dan mendukung serangkaian fitur yang berbeda.
Untuk detail teknis, Anda dapat membaca makalah (dalam IEEE S & P'20 ) untuk versi X64 dan tesis ini untuk versi ARM64.
Kretrowrite adalah varian dari versi X64 yang mendukung penulisan ulang modul kernel Linux.
Retowrite diimplementasikan dalam Python3 (3.6). Itu tergantung pada pyelftools dan capstone . Untuk menginstal dependensi, silakan jalankan:
pip install - r requirements . txtTidak disarankan untuk menginstal dependensi dari manajer paket distro Anda, karena mungkin sudah ketinggalan zaman.
| Retowrite-X64 | retowrite-aarch64 | |
|---|---|---|
| binari yang dilucuti | (WIP) | ✅ |
| Binari non-pie | ✅ | |
| Kompiler non-standar | ✅ | |
| Nol overhead | ✅ | ✅ |
| Dukungan modul kernel | ✅ | |
| Instrumentasi AFL-Coverage | ✅ | ✅ |
| Instrumentasi Asan | ✅ | ✅ |
| Dukungan C ++ | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output Pilih Pass Instrumentasi yang ingin Anda terapkan dengan retrowrite -m <pass> Anda dapat menemukan lulus instrumentasi yang tersedia di folder rwtools_x64 dan rwtools_arm64 .
Tersedia Instrumentasi Pass untuk X64: - Addressanitizer - Informasi AFL -Coverage
Instrumentasi yang tersedia untuk Aarch64: - AddressSanitizer - Informasi AFL -Coverage + Forkserver - Integritas Aliran Kontrol Berbasin Kasar pada Entri Fungsi
retrowrite --asan </path/to/binary/> </path/to/output/binary>
Catatan: Jika pada x64, pastikan binernya tidak tergantung posisi dan tidak dilucuti. Ini dapat diperiksa menggunakan perintah file (output harus mengatakan ELF shared object ).
Contoh, buat versi instrumentasi dari /bin/ls :
retrowrite --asan /bin/ls ls-basan-instrumented.s
Ini akan menghasilkan file perakitan ( .s ). Untuk mengompilasi kembali rakitan kembali menjadi biner, itu tergantung pada arsitektur:
Perakitan yang dihasilkan dapat dirakit dan ditautkan menggunakan kompiler apa pun, seperti:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Debug Jika Anda mendapatkan undefined reference to `__asan_init_v4' , ganti" asan_init_v4 "oleh" asan_init "dalam file perakitan, perintah berikut dapat membantu Anda melakukan itu: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
Di AARCH64, kami juga mengandalkan kompiler standar untuk berkumpul dan menautkan tetapi kumpulan bendera kompiler sedikit lebih terlibat dan jadi kami menyediakan sakelar -a pada retrowrite utama yang dapat dilakukan untuk Anda:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Untuk menghasilkan biner AFL-Instrumented, pertama-tama hasilkan perakitan yang dilambangkan seperti dijelaskan di atas. Kemudian, kompilasi ulang perakitan yang dilambangkan dengan afl-gcc dari AFL ++ seperti ini:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
atau afl-clang .
Untuk instrumen biner dengan informasi cakupan, gunakan Cakupan Instrumentation Pass dengan retrowrite -m coverage <input file> <output asm> . Merakit kembali biner dengan retrowrite -a <output asm> <new binary> .
Biner sekarang dapat disalurkan dengan:
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retowrite juga mencoba menambahkan instrumentasi untuk bertindak sebagai forkserver untuk AFL; Jika ini menyebabkan masalah, Anda dapat menonaktifkan perilaku ini dengan menggunakan export AFL_NO_FORKSERVER=1
Untuk menghasilkan perakitan yang dilambangkan yang dapat dimodifikasi dengan tangan atau pasca-diproses oleh alat yang ada, jangan tentukan pass instrumentasi apa pun:
retrowrite </path/to/binary> <path/to/output/asm/files>
File ASM output dapat diedit secara bebas dengan tangan atau dengan alat lain. Post-modifikasi, file ASM dapat dikumpulkan untuk biner yang berfungsi seperti yang dijelaskan di atas.
Sementara retrowrite dapat dioperasikan dengan alat lain, kami sangat mendorong para peneliti untuk menggunakan API retowrite untuk kebutuhan instrumentasi / modifikasi biner mereka! Ini menghemat upaya tambahan untuk harus memuat dan menguraikan file binari atau perakitan.
Jalankan setup.sh :
./setup.sh kernelAktifkan virtualEnv (dari root repositori):
source retro/bin/activate(Bonus) untuk keluar dari VirtualEnv saat Anda selesai dengan retowrite:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> Untuk kampanye fuzzing, silakan lihat Fuzzing/ Folder.
Secara umum, librw/ berisi kode untuk memuat, membongkar, dan simbolisasi binari dan membentuk inti dari semua transformasi. Tiket transformasi individu yang membangun di atas kerangka kerja penulisan ulang ini, seperti pembersih alamat biner-khusus kami (basan) terkandung sebagai alat individual di rwtools/ .
File dan folder yang dimulai dengan k terhubung dengan versi retrowrite kernel.
Di demo/folder, Anda akan menemukan contoh untuk retrowrite ruang pengguna dan kernel (demo/user_demo dan demo/kernel_demo masing -masing).
Publikasi berikut mencakup berbagai bagian dari proyek retrowrite:
Retrowrite: Secara statis instrumen biner COTS untuk fuzzing dan sanitasi Sushant Dinesh, Nathan Burow, Dongyan Xu, dan Mathias Payer. Di Oakland'20: IEEE International Simposium tentang Keamanan dan Privasi, 2020
Tidak ada sumber, tidak masalah! Biner berkecepatan tinggi Fuzzing Matteo Rizzo, dan Mathias Payer. Dalam 36C3'19: Kongres Komunikasi Chaos, 2019
Lisensi MIT
Hak Cipta (C) 2019 Hexhive Group, Sushant Dinesh [email protected], Luca di Bartolomeo [email protected], antony vennard [email protected], matteo rizzo [email protected], Mathias [email protected], Mathias [email protected] MATHIAS MATHIAS.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.