Dalam 10 cara untuk menganalisis file biner di Linux , saya menjelaskan cara menggunakan seperangkat alat asli Linux yang kaya untuk menganalisis binari. Tetapi jika Anda ingin menjelajahi biner Anda lebih jauh, Anda memerlukan alat yang dibuat khusus untuk analisis biner. Jika Anda baru mengenal analisis biner dan sebagian besar bekerja dengan bahasa skrip, 9 alat binutils GNU penting akan membantu Anda mulai mempelajari proses kompilasi dan apa yang dimaksud dengan biner.
Mengapa saya membutuhkan alat lain?
Lebih banyak sumber daya Linux
- Lembar contekan perintah Linux
- Lembar contekan perintah Linux tingkat lanjut
- Kursus online gratis:Ikhtisar Teknis RHEL
- Lembar contekan jaringan Linux
- Lembar contekan SELinux
- Lembar contekan perintah umum Linux
- Apa itu container Linux?
- Artikel Linux terbaru kami
Wajar untuk bertanya mengapa Anda membutuhkan alat lain jika alat asli Linux yang ada melakukan hal serupa. Yah, itu untuk alasan yang sama Anda menggunakan ponsel Anda sebagai jam alarm Anda, untuk membuat catatan, sebagai kamera, untuk mendengarkan musik, menjelajahi internet, dan kadang-kadang untuk membuat dan menerima panggilan. Sebelumnya, perangkat dan alat terpisah menangani fungsi-fungsi ini — seperti kamera fisik untuk mengambil gambar, buku catatan kecil untuk mencatat, jam alarm di samping tempat tidur untuk membangunkan, dan sebagainya. Memiliki satu perangkat untuk melakukan banyak hal (tetapi terkait) nyaman untuk pengguna. Juga, fitur pembunuhnya adalah interoperabilitas antara fungsi yang terpisah.
Demikian pula, meskipun banyak alat Linux memiliki tujuan tertentu, memiliki fungsionalitas serupa (dan lebih baik) yang digabungkan ke dalam satu alat sangat membantu. Inilah mengapa menurut saya Radare2 harus menjadi alat bantu Anda kapan pun Anda perlu bekerja dengan binari.
Radare2 (juga dikenal sebagai r2) adalah "kerangka kerja reverse engineering dan perangkat baris perintah mirip Unix," menurut profil GitHub-nya. "2" dalam namanya karena versi ini ditulis ulang dari awal untuk membuatnya lebih modular.
Mengapa Radare2?
Ada banyak alat Linux (non-asli) di luar sana yang digunakan untuk analisis biner, jadi mengapa Anda harus memilih Radare2? Alasan saya sederhana.
Pertama, ini adalah proyek open source dengan komunitas yang aktif dan sehat. Jika Anda mencari fitur baru yang apik atau ketersediaan perbaikan bug, ini sangat penting.
Kedua, Radare2 dapat digunakan pada baris perintah, dan memiliki lingkungan antarmuka pengguna grafis (GUI) yang kaya yang disebut Cutter bagi mereka yang lebih nyaman dengan GUI. Menjadi pengguna Linux lama, saya memberi makan lebih nyaman di shell. Meskipun ada sedikit kurva pembelajaran untuk membiasakan diri dengan perintah Radare2, saya akan membandingkannya dengan mempelajari Vim. Anda mempelajari hal-hal dasar terlebih dahulu, dan setelah Anda menguasainya, Anda beralih ke hal-hal yang lebih maju. Dalam waktu singkat, itu menjadi kebiasaan.
Ketiga, Radare2 memiliki dukungan yang baik untuk alat eksternal melalui plugin. Misalnya, alat analisis dan pembalik biner Ghidra open source baru-baru ini populer untuk fitur dekompilernya, yang merupakan elemen penting dari perangkat lunak pembalik. Anda dapat menginstal dan menggunakan dekompiler Ghidra langsung dari konsol Radare2, yang luar biasa dan memberi Anda yang terbaik dari keduanya.
Memulai Radare2
Untuk menginstal Radare2, cukup klon repo dan jalankan user.sh
naskah. Anda mungkin perlu menginstal beberapa paket prasyarat jika belum ada di sistem Anda. Setelah instalasi selesai, jalankan r2 -v
perintah untuk melihat apakah Radare2 telah diinstal dengan benar:
$ git clone https://github.com/radareorg/radare2.git
$ cd radare2
$ sys/user.sh
# versi
$ r2 -v
radare2 4.6.0-git 25266 @ linux-x86-64 git.4.4.0-930-g48047b317
komit:48047b3171e6ed0480a71a04c3693a0650d03543 build:2020-11-17__09:31 :03
$
Dapatkan biner uji sampel
Setelah r2 terinstal, Anda memerlukan biner sampel untuk mencobanya. Anda dapat menggunakan biner sistem apa pun (ls
, bash
, dan seterusnya), tetapi untuk mempermudah tutorial ini, kompilasi program C berikut:
$ cat adder.c
#include
int adder(int num) {
return num + 1;
}
int main() {
int res, num1 =100;
res =adder(num1);
printf("Nomor sekarang adalah :%d\n", res);
return 0;
}
$
$
$ gcc adder.c -o adder
$
$ file adder
adder:ELF 64-bit LSB yang dapat dieksekusi, x86-64, versi 1 (SYSV), tertaut secara dinamis, juru bahasa /lib64/ld-linux-x86-64.so.2, untuk GNU/Linux 3.2.0, BuildID [sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240, tidak dilucuti
$
$ ./adder
Nomor sekarang adalah :101
$
Muat biner
Untuk menganalisis biner, Anda harus memuatnya di Radare2. Muat dengan menyediakan file sebagai argumen baris perintah ke r2
memerintah. Anda dijatuhkan ke konsol Radare2 terpisah yang berbeda dari shell Anda. Untuk keluar dari konsol, Anda dapat mengetik Keluar atau Keluar atau tekan Ctrl +P :
$ r2 ./adder
-- Pelajari pancake seolah-olah Anda radare!
[0x004004b0]> berhenti
$
Analisis biner
Sebelum Anda dapat menjelajahi biner, Anda harus meminta r2 untuk menganalisisnya untuk Anda. Anda dapat melakukannya dengan menjalankan aaa
perintah di konsol r2;
$ r2 ./adder
-- Maaf, radare2 mengalami kesalahan internal.
[0x004004b0]>
[0x004004b0]>
[0x004004b0]> aaa
[x] Analisis semua flag yang dimulai dengan sym. dan entry0 (aa)
[x] Analisis panggilan fungsi (aac)
[x] Analisis len byte instruksi untuk referensi (aar)
[x] Periksa vtables
[ x] Ketik analisis pencocokan untuk semua fungsi (aaft)
[x] Sebarkan informasi noreturn
[x] Gunakan -AA atau aaaa untuk melakukan analisis eksperimental tambahan.
[0x004004b0]>
Ini berarti bahwa setiap kali Anda memilih biner untuk analisis, Anda harus mengetikkan perintah tambahan ke aaa
setelah memuat biner. Anda dapat melewati ini dengan memanggil r2 dengan -A
diikuti dengan nama biner; ini memberitahu r2 untuk menganalisis biner secara otomatis untuk Anda:
$ r2 -A ./adder
[x] Analisis semua flag yang dimulai dengan sym. dan entry0 (aa)
[x] Analisis panggilan fungsi (aac)
[x] Analisis len byte instruksi untuk referensi (aar)
[x] Periksa vtables
[ x] Ketik analisis pencocokan untuk semua fungsi (aaft)
[x] Sebarkan informasi noreturn
[x] Gunakan -AA atau aaaa untuk melakukan analisis eksperimental tambahan.
-- Sudah up-to- tanggal.
[0x004004b0]>
Dapatkan beberapa informasi dasar tentang biner
Sebelum Anda mulai menganalisis biner, Anda memerlukan titik awal. Dalam banyak kasus, ini dapat berupa format file biner (ELF, PE, dan sebagainya), arsitektur untuk biner tersebut (x86, AMD, ARM, dan sebagainya), dan apakah biner tersebut 32 bit atau 64 bit . iI
yang praktis dari R2 perintah dapat memberikan informasi yang diperlukan:
[0x004004b0]> iI
arch x86
baddr 0x400000
binsz 14724
bintype elf
bits 64
canary false
class ELF64
kompilator GCC:(GNU) 8.3.1 20190507 (Red Hat 8.3.1-4)
crypto false
endian little
havecode true
intrp /lib64/ld -linux-x86-64.so.2
laddr 0x0
lang c
linenum true
lsyms true
machine Arsitektur AMD x86-64
maxopsz 16
minopsz 1
nx true
os linux
pcalign 0
pic false
relocs true
relro partial
rpath NONE
sanitiz false
static false
stripped false
subsys linux
va true
[0x004004b0]>
[0x004004b0]>Impor dan ekspor
Seringkali, setelah Anda mengetahui jenis file yang Anda tangani, Anda ingin mengetahui fungsi perpustakaan standar seperti apa yang digunakan biner atau mempelajari fungsionalitas potensial program. Dalam contoh program C dalam tutorial ini, satu-satunya fungsi library adalah
printf
untuk mencetak pesan. Anda dapat melihat ini dengan menjalankanii
perintah, yang menunjukkan semua impor biner:[0x004004b0]> ii
[Impor]
nth vaddr bind type lib name
―――――――――――――――――――――
1 0x00000000 LEMAH NOTYPE _ITM_deregisterTMCloneTable
2 0x004004a0 GLOBAL FUNC printf
3 0x00000000 GLOBAL FUNC 0000 start _5 0x00000000 LEMAH NOTYPE _ITM_registerTMCloneTable Biner juga dapat memiliki simbol, fungsi, atau datanya sendiri. Fungsi-fungsi ini biasanya ditampilkan di bawah
Exports
. Biner pengujian memiliki dua fungsi—utama dan penambah—yang diekspor. Fungsi lainnya ditambahkan selama fase kompilasi ketika biner sedang dibangun. Pemuat membutuhkan ini untuk memuat biner (jangan terlalu khawatir tentang mereka untuk saat ini):[0x004004b0]>
[0x004004b0]> iE
[Ekspor]
nth paddr vaddr bind type size lib name
―――――――
82 0x00000650 0x00400650 Global Func 5 __LIBC_CSU_FINI
85 ---------- 0x00601024 NOTYPE GLOBAL 0 _EDATA
86 0x00000658 0x00400658 Global Func 0 _FINI
89 0x00001020 0x00601020 Global Notype 0 __data_Start
90 0x00000596 0x00400596 Global Func 15 Adder
92 0x00000670 0x00400670 Global obj 0 __dso_handle
93 0x00000668 0x00000668 0x00400668 Global obj 4 _io_stdin_ bekas
94 0x000005E0 0x004005E0 Global Func 101 __LIBC_CSU_INIT
95 - --------- 0x00601028 PEMBERITAHUAN GLOBAL 0 _end
96 0x000004e0 0x004004e0 FUNC GLOBAL 5 _dl_relocate_static_pie
97 0x000004b0 47 _0 > _0NC - 0x00601024 PEMBERITAHUAN GLOBAL 0 __bss_start
99 0x00000 5a5 0x004005a5 GLOBAL FUNC 55 main
100 ---------- 0x00601028 OBJ GLOBAL 0 __TMC_END__
102 0x00000468 0x00400468 0 _ FUNC 0 >
/pra>Info hash
Bagaimana Anda tahu jika dua binari serupa? Anda tidak dapat benar-benar membuka biner dan melihat kode sumber di dalamnya. Dalam kebanyakan kasus, hash biner—md5sum, sha1, sha256—digunakan untuk mengidentifikasinya secara unik. Anda dapat menemukan hash biner menggunakan
it
perintah:[0x004004b0]> itu
md5 7e6732f2b11dec4a0c7612852cede670
sha1 d5fa848c4b53021f6570dd9b18d115595a2290ae
sha256>bdd5a492219dac51443a8160cpre4004sha256 13dd5a492219dac51443a8160Fungsi
Kode dikelompokkan menjadi fungsi; untuk membuat daftar fungsi mana yang ada dalam biner, jalankan
afl
memerintah. Daftar berikut menunjukkan fungsi utama dan penambah. Biasanya, fungsi yang dimulai dengansym.imp
diimpor dari perpustakaan standar (glibc dalam hal ini):[0x004004b0]> afl
0x004004b0 1 46 entri0
0x004004f0 4 41 -> 34 sym.deregister_tm_clones
0x00400520 4 57 4 57 4005 sym.> 32 sym .__ do_global_dtors_aux
0x00400590 1 6 entry.init0
0x00400650 1 5 sym .__ Libc_CSU_Fini 4 101 loc..annobin_elf_init.c
0x004004e0 1 5 loc..nannobin_static_reloc.c
0x004005a5 1 55 Main
0x004004a0 1 6 smt.Printf
0x00400468 3 27 Sym. _init
[0x004004b0]>Referensi silang
Dalam C, fungsi utama adalah tempat program memulai eksekusinya. Idealnya, fungsi lain dipanggil dari utama dan, setelah keluar dari program, fungsi utama mengembalikan status keluar ke sistem operasi. Ini terbukti dalam kode sumber; Namun, bagaimana dengan biner? Bagaimana Anda bisa tahu di mana fungsi penambah dipanggil?
Anda dapat menggunakan
axt
perintah diikuti dengan nama fungsi untuk melihat di mana fungsi penambah dipanggil; seperti yang Anda lihat di bawah, itu dipanggil dari fungsi utama. Ini dikenal sebagai referensi silang. Tapi apa yang memanggil fungsi utama itu sendiri?axt main
fungsi di bawah ini menunjukkan bahwa itu dipanggil denganentry0
(Saya akan berhenti belajar tentangentry0
sebagai latihan untuk pembaca):[0x004004b0]> axt sym.adder
main 0x4005b9 [CALL] panggil sym.adder
[0x004004b0]>
[0x004004b0]> axt main
entry0 0x4004d1 [DATA ] mov rdi, main
[0x004004b0]>Cari lokasi
Saat bekerja dengan file teks, Anda sering berpindah di dalam file dengan merujuk nomor baris diikuti dengan nomor baris atau kolom; dalam biner, Anda menggunakan alamat. Ini adalah bilangan heksadesimal yang dimulai dengan
0x
diikuti dengan alamat. Untuk menemukan posisi Anda dalam biner, jalankans
memerintah. Untuk pindah ke lokasi lain, gunakans
perintah diikuti dengan alamatnya.Nama fungsi seperti label, yang diwakili oleh alamat secara internal. Jika nama fungsi dalam biner (tidak dilucuti), Anda dapat menggunakan
s
perintah diikuti dengan nama fungsi untuk melompat ke alamat fungsi tertentu. Demikian pula, jika Anda ingin melompat ke awal biner, ketiks 0
:[0x004004b0]> s
0x4004b0
[0x004004b0]>
[0x004004b0]> s utama
[0x004005a5]>
[0x004005a5]> s
0x4005a5
[0x004005a5]>
[0x004005a5]> s sym.adder
[0x00400596]>
[0x00400596]> s
0x400596
[ 0x00400596]>
[0x00400596]> s 0
[0x00000000]>
[0x00000000]> s
0x0
[0x00000000]>Tampilan heksadesimal
Seringkali, biner mentah tidak masuk akal. Ini dapat membantu untuk melihat biner dalam mode heksadesimal di samping representasi ASCII yang setara:
[0x004004b0]> s main
[0x004005a5]>
[0x004005a5]> px
- offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x004005a5 5548 89e5 4883 ec10 c745 fc64 0000 008b UH..H....E.d....
0x004005b5 45fc 89c7 e8d8 ffff ff89 45f8 8b45 f889 E.........E..E. .
0x004005c5 c6bf 7806 4000 b800 0000 00e8 cbfe ffff ..x.@...........
0x004005d5 b800 0000 00c9 c30f 1f40 00f3 0f1e fa41 ....... [email protected]
0x004005e5 5749 89d7 4156 4989 f641 5541 89fd 4154 WI..AVI..AUA..AT
0x004005f5 4c8d 2504 0820 0055 488d 2d04 0820 0053 L.%.. .UH.-.. .S
0x00400605 4c29 e548 83ec 08e8 57fe ffff 48c1 fd03 L).H....W...H...
0x00400615 741f 31db 0f1f 8000 0000 004c 89fa 4c89 t.1........L..L.
0x00400625 f644 89ef 41ff 14dc 4883 c301 4839 dd75 .D..A...H...H9.u
0x00400635 ea48 83c4 085b 5d41 5c41 5d41 5e41 5fc3 .H...[]A\A]A^A_.
0x00400645 9066 2e0f 1f84 0000 0000 00f3 0f1e fac3 .f............. .
0x00400655 0000 00f3 0f1e fa48 83ec 0848 83c4 08c3 .......H...H....
0x00400665 0000 0001 0002 0000 0000 0000 0000 0000 ............
0x00400675 0000 004e 756d 6265 7220 6e6f 7720 6973 ...Nomor sekarang
0x00400685 2020 3a20 2564 0a00 0000 0001 1b03 3b44 :%d........;D
0x00400695 0000 0007 0000 0000 feff ff88 0000 0020 ...............
[0x004005a5]>Membongkar
Jika Anda bekerja dengan binari terkompilasi, tidak ada kode sumber yang dapat Anda lihat. Kompilator menerjemahkan kode sumber ke dalam instruksi bahasa mesin yang dapat dipahami dan dijalankan oleh CPU; hasilnya adalah biner atau dapat dieksekusi. Namun, Anda dapat melihat instruksi perakitan (mnemonik) untuk memahami apa yang sedang dilakukan program. Misalnya, jika Anda ingin melihat apa yang dilakukan fungsi utama, Anda dapat mencari alamat fungsi utama menggunakan
s main
lalu jalankanUntuk memahami instruksi perakitan, Anda perlu merujuk ke manual arsitektur (dalam hal ini x86), antarmuka biner aplikasinya (ABI, atau konvensi panggilan), dan memiliki pemahaman dasar tentang cara kerja tumpukan:
[0x004004b0]> s utama
[0x004005a5]>
[0x004005a5]> s
0x4005a5
[0x004005a5]>
[0x004005a5]> pdf
; DATA XREF dari entri0 @ 0x4004d1
┌ 55:int main (int argc, char **argv, char **envp);
│ ; var int64_t var_8h @ rbp-0x8
│ ; var int64_t var_4h @ rbp-0x4
│ 0x004005A5 55 push rbp
│ 0x004005A6 48895 mov RBP, RSP
│ 0x004005A9 4883EC10 SUB RSP, 0x10
│ 0x004005AD C745FC640000. mov dword [var_4h], 0x64 ; 'd'; 100
│ 0x004005B4 8B45FC MOV EAX, DWORD [var_4h]
│ 0x004005B7 89c7 Mov EDI, EAX
│ 0x004005B9 E8D8FFFFFF Hubungi sym.adder
│ 0x004005BE 8945F8 MOV DWORD [VAR_8H], EAX
│ 0x004005C1 8B45F8 MOV EAX, DWORD [var_8h]
│ 0x004005c4 89c6 mov ESI, EAX
│ 0x004005C6 BF78064000 Mov EDI, Str.number_now_is __:__ D; 0x400678; "Nomor sekarang adalah :%d\n"; const char *format
│ 0x004005cb b800000000 mov eax, 0
│ 0x004005d0 e8cbfeffff call sym.imp ; int printf (format const char *)
│ 0x004005d5 b800000000 mov ex, 0
│ 0x004005da c9 cuti
└ 0x004005db c3 ret
[0x004005A5]>Berikut adalah pembongkaran untuk fungsi penambah:
[0x004005a5]> s sym.adder
[0x00400596]>
[0x00400596]> s
0x400596
[0x00400596]>
[0x00400596]> pdf
; PANGGILAN XREF dari utama @ 0x4005b9
┌ 15:sym.adder (int64_t arg1);
│ ; var int64_t var_4h @ rbp-0x4
│ ; arg int64_t arg1 @ rdi
│ 0x00400596 55 push rbp
│ 0x00400597 48895 mov RBP, RSP
│ 0x00400559A 897DFC mov dword [var_4h], EDI; arg1
│ 0x0040059D 8B45FC MOV EAX, DWORD [var_4h]
│ 0x004005A0 83C001 Tambahkan EAX, 1
│ 0x004005A3 5D POP RBP
└ 0x004005A4 C3 RET
[0x00400596]>String
Melihat string mana yang ada dalam biner dapat menjadi titik awal untuk analisis biner. String dikodekan menjadi biner dan sering memberikan petunjuk penting untuk mengalihkan fokus Anda untuk menganalisis area tertentu. Jalankan
iz
perintah dalam biner untuk mendaftar semua string. Biner pengujian hanya memiliki satu string yang di-hardcode dalam biner:[0x004004b0]> iz
[Strings]
nth paddr vaddr len size section type string
―――――――――――――――――――
0 0x00000678 0x00400678 20 21 .rodata ascii Nomor sekarang adalah :%d\n
[0x004004b0]>String referensi silang
Seperti halnya fungsi, Anda dapat melakukan referensi silang string untuk melihat dari mana string tersebut dicetak dan memahami kode di sekitarnya:
[0x004004b0]> ps @ 0x400678
Nomor sekarang adalah :%d
[0x004004b0]>
[0x004004b0]> axt 0x400678
utama 0x4005c6 [DATA ] mov edi, str.Number_now_is__:__d
[0x004004b0]>Mode visual
Ketika kode Anda rumit dengan banyak fungsi yang dipanggil, mudah tersesat. Akan sangat membantu untuk memiliki tampilan grafik atau visual dari fungsi mana yang dipanggil, jalur mana yang diambil berdasarkan kondisi tertentu, dll. Anda dapat menjelajahi mode visual r2 dengan menggunakan
VV
perintah setelah pindah ke fungsi yang menarik. Misalnya, untuk fungsi penambah:[0x004004b0]> s sym.adder
[0x00400596]>
[0x00400596]> VV
Debugger
Sejauh ini, Anda telah melakukan analisis statis—Anda hanya melihat hal-hal dalam biner tanpa menjalankannya. Terkadang Anda perlu mengeksekusi biner dan menganalisis berbagai informasi dalam memori saat runtime. debugger internal r2 memungkinkan Anda menjalankan biner, memasukkan breakpoint, menganalisis nilai variabel, atau membuang konten register.
Mulai debugger dengan
-d
bendera, dan tambahkan-A
bendera untuk melakukan analisis sebagai beban biner. Anda dapat menyetel breakpoint di berbagai tempat, seperti fungsi atau alamat memori, dengan menggunakandb <function-name>
memerintah. Untuk melihat breakpoint yang ada, gunakandbi
memerintah. Setelah Anda menempatkan breakpoint, mulailah menjalankan biner menggunakandc
memerintah. Anda dapat melihat tumpukan menggunakandbt
perintah, yang menunjukkan panggilan fungsi. Terakhir, Anda dapat membuang isi register menggunakandrr
perintah:$ r2 -d -A ./adder
Proses dengan PID 17453 dimulai...
=lampirkan 17453 17453
bin.baddr 0x00400000
Menggunakan 0x400000
asm.bits 64
[x] Analisis semua flag yang dimulai dengan sym. dan entry0 (aa)
[x] Analisis panggilan fungsi (aac)
[x] Analisis len byte instruksi untuk referensi (aar)
[x] Periksa vtables
[ x] Ketik analisis pencocokan untuk semua fungsi (aaft)
[x] Sebarkan informasi noreturn
[x] Gunakan -AA atau aaaa untuk melakukan analisis eksperimental tambahan.
-- git checkout hamster
[0x7f77b0a28030]>
[0x7f77b0a28030]> db main
[0x7f77b0a28030]>
[0x7f77b0a28030]> db sym.adder
[0x7f77b0a28030]>
dbi
0 0x004005a5 E:1 T:0
1 0x00400596 E:1 T:0
[0x7f77b0a28030]>
[0x7f77b0a28030]> afl | grep main
0x004005a5 1 55 main
[0x7f77b0a28030]>
[0x7f77b0a28030]> afl | grep sym.adder
0x00400596 1 15 sym.adder
[0x7f77b0a28030]>
[0x7f77b0a28030]> dc
tekan breakpoint pada:0x4005a5
[0] [0x004005a5]> dbt
0 0x4005a5 sp:0x0 0 [main] main sym.adder+15
1 0x7f77b 06873 .
2 0x7f77b0a36e0a sp:0x7ffe35ff68e8 144 [??] map.usr_lib64_ld_2.28.so.r_x+65034
[0x004005a5]> dc
telah mencapai titik henti sementara pada 005965096x
400596x
2 0x7f77b0a36e0a> DBT
0 0x400596 SP:0x0 0 [sym.adder] rip entry.init0 + 6
1 0x4005be SP:0x7ffe35ff6838 0 [main] Main + 25
2 0x7F77B0687873 SP:0x7FFE35FF6858 32 [ ??] section..gnu.build.attributes-1345820597
3 0x7f77b0a36e0a sp:0x7ffe35ff68e8 144 [??] map.usr_lib64_ld_2.28.so.r_x>[650034
[650034
[0x00400596]> dr
rax =0x00000064
rb x =0x00000000
rcx =0x7f77b0a21738
rdx =0x7ffe35ff6948
r8 =0x7f77b0a22da0
r9 =0x7f77b0a22da0
r10 =0x0000000f
r11 =0x0000002 =0x004004b0
r13 =0x7ffe35ff6930
r14 =0x00000000
r15 =0x00000000
rsi =0x7ffe35ff6938
rdi =0x00000064
rsp =0x7ffe35ff6838
rbp =0x7ffe35ff6850
rip =0x00400596
rflags =0x00000202
orax =0xffffffffffffff
[0x00400596]>Decompiler
Mampu memahami perakitan merupakan prasyarat untuk analisis biner. Bahasa rakitan selalu terikat dengan arsitektur tempat biner dibangun dan seharusnya dijalankan. Tidak pernah ada pemetaan 1:1 antara baris kode sumber dan kode perakitan. Seringkali, satu baris kode sumber C menghasilkan beberapa baris perakitan. Jadi, membaca kode assembly baris demi baris tidak optimal.
Di sinilah dekompiler masuk. Mereka mencoba merekonstruksi kemungkinan kode sumber berdasarkan instruksi perakitan. Ini TIDAK PERNAH persis sama dengan kode sumber yang digunakan untuk membuat biner; itu adalah representasi dekat dari sumber berdasarkan perakitan. Juga, pertimbangkan bahwa pengoptimalan kompiler yang menghasilkan kode perakitan berbeda untuk mempercepat, mengurangi ukuran biner, dll., akan membuat pekerjaan dekompiler lebih sulit. Selain itu, pembuat malware sering kali dengan sengaja mengaburkan kode untuk menghentikan analis malware.
Radare2 menyediakan dekompiler melalui plugin. Anda dapat menginstal dekompiler apa pun yang didukung oleh Radare2. Lihat plugin saat ini dengan
r2pm -l
memerintah. Instal contohr2dec
dekompiler denganr2pm install
perintah:$ r2pm -l
$
$ r2pm install r2dec
Cloning ke 'r2dec'...
remote:Menghitung objek:100, selesai.
remote :Menghitung objek:100% (100/100), selesai.
jarak jauh:Mengompresi objek:100% (97/97), selesai.
jarak jauh:Total 100 (delta 18), digunakan kembali 27 (delta 1), pack-reused 0
Menerima objek:100% (100/100), 1,01 MiB | 1,31 MiB/s, selesai.
Menyelesaikan delta:100% (18/18), selesai.
Instal Selesai Untuk r2dec
gmake:Memasuki direktori '/root/.local/share/radare2 /r2pm/git/r2dec/p'
[CC] duktape/duktape.o
[CC] duktape/duk_console.o
[CC] core_pdd.o
[CC] core_pdd.so
gmake:Meninggalkan direktori '/root/.local/share/radare2/r2pm/git/r2dec/p'
$
$ r2pm -l
r2dec
$Tampilan pengurai
Untuk mendekompilasi biner, muat biner di r2 dan analisis otomatis. Pindah ke fungsi yang diinginkan—penambah dalam contoh ini—menggunakan
s sym.adder
perintah, lalu gunakanpdda
perintah untuk melihat rakitan dan kode sumber yang didekompilasi secara berdampingan. Membaca kode sumber yang didekompilasi ini seringkali lebih mudah daripada membaca perakitan baris demi baris:$ r2 -A ./adder
[x] Analisis semua flag yang dimulai dengan sym. dan entry0 (aa)
[x] Analisis panggilan fungsi (aac)
[x] Analisis len byte instruksi untuk referensi (aar)
[x] Periksa vtables
[ x] Ketik analisis pencocokan untuk semua fungsi (aaft)
[x] Sebarkan informasi noreturn
[x] Gunakan -AA atau aaaa untuk melakukan analisis eksperimental tambahan.
-- Apa yang Anda inginkan debug hari ini?
[0x004004b0]>
[0x004004b0]> s sym.adder
[0x00400596]>
[0x00400596]> s
0x400596
[ 0x00400596]>
[0x00400596]> pdda
; perakitan | /* keluaran kode semu r2dec */
| /* ./adder @ 0x400596 */
| #include
|
; (fcn) sym.adder () | int32_t adder (int64_t arg1) {
| int64_t var_4h;
| rdi =arg1;
0x00400596 tekan rbp |
0x00400597 mov rbp, rsp |
0x0040059a mov dword [rbp - 4], edi | *((rbp - 4)) =edi;
0x0040059d mov eax, dword [rbp - 4] | eax =*((rbp - 4));
0x004005a0 tambahkan eax, 1 | eax++;
0x004005a3 pop rbp |
0x004005a4 ret | return eax;
| }
[0x00400596]>Konfigurasikan setelan
Saat Anda merasa lebih nyaman dengan Radare2, Anda akan ingin mengubah konfigurasinya untuk menyesuaikannya dengan cara Anda bekerja. Anda dapat melihat konfigurasi default r2 menggunakan
e
memerintah. Untuk mengatur konfigurasi tertentu, tambahkanconfig = value
setelahe
perintah:[0x004005a5]> e | wc -l
593
[0x004005a5]> e | grep sintaks
asm.syntax =intel
[0x004005a5]>
[0x004005a5]> e asm.syntax =att
[0x004005a5]>
[0x004005a5]> e | grep sintaks
asm.syntax =att
[0x004005a5]>Untuk membuat perubahan konfigurasi permanen, letakkan di file startup bernama
.radare2rc
bahwa r2 membaca saat startup. File ini biasanya ditemukan di direktori home Anda; jika tidak, Anda dapat membuatnya. Beberapa contoh opsi konfigurasi meliputi:$ cat ~/.radare2rc
e asm.syntax =att
e scr.utf8 =true
eco solarized
e cmd.stack =true
e stack.size =256
$Jelajahi lebih lanjut
Anda telah melihat cukup banyak fitur Radare2 untuk menemukan jalan di sekitar alat ini. Karena Radare2 mengikuti filosofi Unix, meskipun Anda dapat melakukan berbagai hal dari konsolnya, Radare2 menggunakan kumpulan biner terpisah di bawahnya untuk melakukan tugasnya.
Jelajahi binari mandiri yang tercantum di bawah ini untuk melihat cara kerjanya. Misalnya, informasi biner terlihat di konsol dengan
iI
perintah juga dapat ditemukan menggunakanrabin2 <binary>
perintah:$ cd bin/
$
$ ls
awalan r2agent r2pm rabin2 radiff2 ragg2 rarun2 rasm2
r2 r2-indent r2r rasignrah2 radare2 /pra>Apa pendapat Anda tentang Radare2? Bagikan tanggapan Anda di komentar.
Linux