Tutorial ini sekedar memperkenalkan cara memakai Ghidra dan IDA (baik pro maupun free). Tadinya saya hanya ingin membahas Ghidra saja, tapi karena saya juga belum pernah menulis tutorial IDA, jadi sekalian saja, sekaligus bisa dibandingkan langsung.
Perlu dicatat bahwa mengajari orang memakai Microsoft Word atau Libre Office berbeda dengan mengajari orang menulis novel atau cerita pendek. Baik Ghidra maupun IDA hanya salah satu dari banyak tool reverse engineering. Sekedar bisa memakai Ghidra/IDA tidak bisa membuat Anda menjadi seorang reverse engineer, sama seperti bisa mengetik di Microsoft Word tidak akan menjadikan Anda tiba-tiba jadi penulis novel.
Jika ingin belajar reverse engineering, maka pelajarilah dasar-dasarnya, saya memiliki FAQ mengenai reverse engineering yang bisa Anda baca.
Contents
Lingkup dan tujuan tulisan
Scope tulisan ini hanya tutorial dasar saja, tidak mencakup topik tingkat mahir seperti scripting dan debugging. Fitur IDA yang dibahas hanya yang ada di IDA Free dan Pro, tidak membahas fitur spesifik IDA Pro.
Tulisan ini semoga bisa minimal mengajari bagaimana mulai memakai IDA dan Ghidra. Saya sarankan program awal yang dibongkar adalah program buatan sendiri, supaya paham hasil kompilasi dan dekompilasinya.
Selain untuk reverser, IDA dan Ghidra berguna untuk mengecek hasil obfuscation, dan berguna juga untuk programmer yang kadang perlu mendebug sampai low level. Kadang saya perlu mengajari developer untuk mendebug sebuah fungsi, membaca error dump, atau sekedar mengecek apakah sudah benar menggunakan sebuah produk obfuscator atau protektor. Kadang jika salah konfigurasi, aplikasi tetap tidak terproteksi meski sudah membeli tool mahal. Tutorial di sini bisa cukup membantu verifikasi hal seperti itu.
Tulisan ini juga semoga bisa membantu reverser yang masih bergantung pada IDA dan ingin mencoba beralih ke Ghidra.
Instalasi
IDA memiliki installer versi free di webnya, dan Ghidra punya file zip yang tinggal diekstrak. Saya asumsikan Ghidra dan IDA sudah bisa Anda install, kalau belum bisa menginstallnya, berarti Anda belum siap untuk melakukan reverse engineering.
Menganalisis File
Di IDA, untuk menganalisis file, cukup: File-Open, lalu pilih file executablenya, kita akan ditanya: ingin meload file ini sebagai apa. Biasanya deteksi IDA sudah benar, dan kita tidak perlu melakukan apapun, tapi kalau kita melakukan reverse engineering binary custom, maka perlu set berbagai opsi di sini.
Setelah langkah tersebut, IDA langsung menganalisis filenya, dan kita bisa langsung bekerja.
Di Ghidra, langkahnya agak lebih panjang. Pertama kita perlu membuat Project dengan “File -> New Project”, lalu memilih apakah “Shared” atau “Non Shared”. Untuk belajar, kita tidak akan melakukan reverse engineering bersama team, jadi pilih saja “Non Shared”, lalu kita akan ditanya nama project. Setelah langkah ini, kita dapat project kosong.
Kita perlu mengimpor file ke dalam project ini dengan “File -> Import File”, atau menekai “i”. Kita akan ditanya beberapa opsi, tidak selengkap IDA, karena masih ada langkah lanjutan.
Bagaimana kalau salah import atau ingin reload file importnya? delete dulu dari project, lalu import lagi. Perhatikan bahwa ditahap ini, file belum dianalisis. Kita akan mendapatkan laporan hasil import.
Untuk mulai menganalisis, double click pada file yang sudah diimport, atau klik kanan dan “Open in Default Tool” (yaitu Code Browser).
Setelah melakukan double click, kita akan ditanya bahwa filenya belum dianalisis, apakah ingin dianalisis sekarang, jawab dengan “Yes”. Sekarang banyak opsi baru yang muncul. Untuk kebanyakan binary, defaultnya sudah cukup dan tidak perlu dimodifikasi. Untuk binary dengan proteksi tertentu, hasil analisis bisa salah dan bisa kita disable.
Loading file Ghidra lebih lama dibandingkan dengan IDA, apalagi jika filenya sangat besar (misalnya game yang binarynya puluhan megabyte). Lihat di kanan bawah progressnya.
Default titik awal IDA dan Ghidra berbeda, misalnya di IDA file ini akan ditunjukkan bagian “main”-nya sedangkan di Ghidra yang diperlihatkan adalah “start” (fungsi ini yang memanggil main).
Dari titik awal ini sudah bisa dilihat bahwa Ghidra memiliki learning curve yang lebih tinggi dibandingkan IDA. Setidaknya ini benar untuk proyek sederhana.
Dekompilasi
IDA Free saat ini memiliki fitur “cloud decompiler”, artinya kode kita akan dikirim ke cloud dan didekompilasi di server milik Hex Rays (pembuat IDA) dan dikembalikan hasilnya ke kita (hanya dekompilasi Intel saja yang dibolehkan, tidak bisa ARM, jadi tidak bisa dekompilasi aplikasi mobile yang biasanya dalam ARM/ARM64). Karena dekompilasi dilakukan di cloud, hati-hati jika ingin mendekompilasi kode rahasia perusahaan.
IDA Pro bisa melakukan dekompilasi lokal sesuai license yang kita beli. Lisensinya beberapa ribu USD per arsitektur (jadi decompiler Intel dan ARM harus dibeli terpisah, versi 32 bit dan 64 bit juga dijual terpisah).
GHidra bisa melakukan dekompilasi lokal berbagai jenis arsitektur, gratis. Beberapa arsitektur yang sudah saya coba: Intel (32 dan 64 bit, bahkan 16 bit juga bisa), ARM (32 dan 64 bit), serta MIPS. Masih banyak arsitektur lain yang didukung Ghidra tapi belum saya coba.
Di IDA, kita bisa menekan tombol tab dan hasil dekompilasi akan muncul.
Di Ghidra, hasil dekompilasi ada di Window lain. Default hasil kompilasinya IDA lebih mudah terbaca. Contohnya dari gambar di atas dan gambar di bawah:
- Variabel array lokal terdeteksi langsung oleh IDA
- Tipe variabel lokal banyak yang terdeteksi dengan benar
- Display variabel langsung terdeteksi lebih user friendly (-2 bukan 0xfffffffe, walau ini angka yang sama)
- Pemeriksaan stack cookie dimunculkan di Ghidra (defaultnya otomatis disembunyikan di IDA, jadi lebih gampang dibaca)
Berbagai view
Kedua tool memiliki banyak view yang bisa digunakan. Beberapa cukup mirip, misalnya daftar string yang ditemukan. Beberapa lagi cukup berbeda, misalnya tampilan Graph Ghidra lebih rumit tapi juga lebih fleksibel.
Ada banyak sekali view yang bisa dicoba sendiri, saya contohkan dua yang sering saya pakai: Strings dan Graph.
Strings
Untuk programmer yang sekedar ingin mengecek apakah obfuscator bekerja seperti seharusnya, daftar strings ini adalah yang paling gampang dicek. Jika sebelum diobfuscate terlihat stringnya, seharusnya setelah diobfuscate, stringnya akan hilang (tentunya jika opsi obfuscate string diaktifkan).
IDA: View -> Open Subviews -> Strings. Ini bisa difilter dengan Control-F.
GHidra: Window -> Defined Strings. Filter bisa dilakukan dengan textbox yang ada di bawah list.
Graph
Di IDA, dengan menekan spasi, disassembly akan muncul dalam bentuk graph. Di Ghidra ada banyak sekali fungsi Graph yang tersedia, yang dekat dengan milik IDA adalah “Window->Function Graph”. Tampilannya ada animasinya untuk menunjukkan flow graph-nya.
Untuk jenis Graph yang lain, silakan dicoba-coba sendiri.
Walaupun sudah ada decompiler, graph ini masih berguna untuk beberapa hal, misalnya:
- Verifikasi ketika decompiler gagal
- Memastikan kode mana yang perlu dipatch untuk bypass sesuatu
Reversing
Bagian berikutnya adalah membandingkan task yang sering dilakukan ketika reversing. Beberapa hal dasar cukup sama, misalnya menekan ENTER akan mengikuti simbol yang saat ini ada di kursor, menekan G akan menampilkan dialog Goto address/function.
Kustomisasi Ghidra
Sekarang saya memakai kedua tool ini sangat sering, tapi saya sudah memakai IDA sejak lama, jadi di kepala saya, shortcut yang teringat adalah milik IDA. Untungnya Ghidra ini bisa dikustomisasi.
Langkah ini opsional, kalau Anda hanya mau belajar Ghidra, tidak perlu mengikuti shortcut IDA.
Dari window Code Browser, buka menu “Edit-> Tool Options” dan edit Keybinding. Mappingnya bisa diexport, lalu diimport lagi untuk project lain. Perhatikan bahwa satu key bisa dimap ke banyak aksi, dan otomatis akan dijalankan sesuai konteks saat ini. Jika setelah melihat konteks ternyata tetap ada banyak aksi, maka akan muncul popup.
Cross Reference
Munculnya string tertentu atau fungsi tertentu bisa jadi titik awal reversing. Misalnya jika ingin melakukan reverse engineering aplikasi network, dan kita melihat ada fungsi recv
, kita bisa melihat dengan cross reference: fungsi mana yang memanggil recv
, kita bisa mulai melihat bagaimana paket diparse oleh fungsi tersebut.
Di IDA cross reference bisa dilakukan dengan klik kanan “Jump to Xref” (atau shortcut ‘x’ ) ketika kursor di atas variabel/memori/fungsi/data. Di Ghidra, klik kanan pada variabel/memori/fungsi/data, “References -> Find References To”.
Dialog cross reference IDA akan langsung tertutup ketika kita memilih alamat dan menekan enter. Dialog Ghidra akan otomatis scroll ke lokasi disassembly selagi kita memilih alamatnya.
Comment dan Warna
Kerjaan reversing bisa butuh waktu sangat lama, dan biasanya sebagian besar waktunya adalah me-rename fungsi/variabel, menentukan tipe data, dan memberi komentar.
Di kedua tool ini comment untuk tiap baris assembly dan juga untuk hasil dekompilasi bisa ditambahkan. Warna blok juga bisa diubah. Shortcut defaultnya sama untuk keduanya ‘;’ (semicolon/titik koma).
Mengganti nama dan tipe fungsi dan variabel
Di IDA semua perintah rename adalah “n” dan mengganti tipe data adalah “y”, ini berlaku untuk semua: nama parameter, nama struct, nama variabel global, dsb.
Di Ghidra semua terpisah shortcutnya, misalnya di Ghidra perintah untuk mengubah tipe data sebuah variabel global dan mengubah tipe parameter adalah dua hal yang berbeda.
Ini salah satu alasan saya menyeragamkan shortcut Ghidra dengan milik IDA karena dalam hal ini IDA lebih masuk akal.
Rebase
Untuk memudahkan tracing program yang memakai Adress Space Layout Randomization (ASLR), kita bisa melakukan rebase. Di IDA ini bisa diakses melalui Edit -> Segments -> Rebase Program.
Di Ghidra menunya agak lebih tersembunyi, pilih Window -> Memory Map, lalu tekan gambar rumah. Jadi tidak ada nama menu “Rebase”, tersembunyi di icon kecil itu.
Membuat tipe/struct baru
Berbagai kode assembly dan hasil dekompilasi akan lebih mudah terbaca jika kita menggunakan struct yang tepat. Saya tidak akan membahas dalam di tulisan ini, hanya sekedar bagaimana membuat tipe/struct baru di kedua tool.
Di IDA kita bisa mendefinisikan struktur baru di window Structures
Membuat field dilakukan dengan shortcut d
, mengganti nama dengan n
, dsb. Agak terlalu primitif.
Struct (dan yang lain) bisa diakses di Data Type Manager.
Ghidra memiliki editor struct yang sangat visual
Sebagai catatan, kedua tool ini bisa mengimpor struct dari source dalam bahasa C.
Di IDA ini melalui menu File -> Load File -> Parse C header file
Dan di Ghidra: File -> Parse C Source
Patching file
Task berikutnya setelah reversing biasanya adalah patching. Misalnya kita sudah menemukan perbaikan pada binary atau bypass sesuatu, kita ingin mengubah kodenya dan menyimpannya ke file.
Patching kode di kedua tool bisa dilakukan di level byte atau assembly. Di level byte artinya kita menimpa nilai di file, sedangkan untuk assembly, kita memasukkan instruksinya (misalnya “nop”) dan akan diassemble oleh tool.
Defaultnya IDA hanya bisa mengassemble Intel, dan untuk yang lain kita perlu memakai plugin. Ghidra mendukung banyak arsitektur, dan bisa mempatch assembly hampir semuanya.
Setelah selesai di IDA kita bisa menggunakan menu Edit -> Patch Program -> Apply patches to input file jika ingin menyimpan patchnya.
Di Ghidra, kita bisa klik kanan, patch instruction.
Setelah selesai kita bisa menggunakan menu File -> Export Program, lalu memilih format “Original File”:
Penutup
Berbagai fitur yang saya perkenalkan di sini hanya sebagian kecil saja dari fitur-fitur yang dimiliki oleh IDA ataupun Ghidra. Saya hanya memilih fitur yang banyak dipakai di sebagian besar pekerjaan reversing. Tentu saja yang lebih penting adalah pemahaman membaca kode program.
Semoga posting ini cukup berguna, dan semoga di masa depan saya bisa menambahkan tutorial untuk task-task lain (misalnya debugging atau scripting).