Pengenalan dasar memakai Ghidra dan IDA

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.

Versi IDA dan Ghidra dalam tulisan ini

Jika ingin belajar reverse engineering, maka pelajarilah dasar-dasarnya, saya memiliki FAQ mengenai reverse engineering yang bisa Anda baca.

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.

Dialog IDA lebih sederhana

Setelah langkah tersebut, IDA langsung menganalisis filenya, dan kita bisa langsung bekerja.

Siap 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.

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.

Halaman opsi

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.

Laporan hasil import

Untuk mulai menganalisis, double click pada file yang sudah diimport, atau klik kanan dan “Open in Default Tool” (yaitu Code Browser).

File sudah diimport, tapi belum dianalisis

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.

Dialog analisis Ghidra

Loading file Ghidra lebih lama dibandingkan dengan IDA, apalagi jika filenya sangat besar (misalnya game yang binarynya puluhan megabyte). Lihat di kanan bawah progressnya.

Progress loading ada di kanan bawah

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.

Hasil dekompilasi IDA

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)
Disassembly dan dekompilasi bersebelahan

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.

Daftar String di IDA

GHidra: Window -> Defined Strings. Filter bisa dilakukan dengan textbox yang ada di bawah list.

Daftar String di Ghidra

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.

Graph di IDA

Untuk jenis Graph yang lain, silakan dicoba-coba sendiri.

Function Graph di Ghidra

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.

Keybinding ‘y’ saya assign ke banyak aksi, karena di IDA ini semua satu aksi

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”.

References di IDA

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.

References di Ghidra

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.

Menu Rebase cukup jelas

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.

Rebasing di Ghidra

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

Struktur di Ghidra

Membuat field dilakukan dengan shortcut d, mengganti nama dengan n, dsb. Agak terlalu primitif.

Struct (dan yang lain) bisa diakses di Data Type Manager.

Membuat tipe baru di Ghidra

Ghidra memiliki editor struct yang sangat visual

Dialog Ghidra lebih intuitif

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

Parsing source C di IDA

Dan di Ghidra: File -> Parse C Source

Parsing source C di Ghidra

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.

Assemble Instruction di IDA

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.

Assembling di IDA

Di Ghidra, kita bisa klik kanan, patch instruction.

Assembling di Ghidra

Setelah selesai kita bisa menggunakan menu File -> Export Program, lalu memilih format “Original File”:

Export di Ghidra

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).

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.