Bab 1: Mengenal Reverse Engineering?

Daftar Isi Utama

Apa sih reverse engineering (RE) itu? RE adalah proses untuk membongkar bahan dan teknologi yang ada pada suatu benda. Orang bisa mereverse engineer aneka macam hal, misalnya resep masakan atau benda elektronik, atau program. Tentunya dalam konteks ini, yang dimaksud adalah software reverse engineering, yaitu proses bagaimana kita bisa mengetahui algoritma program (atau source codenya jika mungkin).

Reverse Engineering (RE) merupakan salah satu hal yang sangat penting dalam bidang security. Hal-hal lain juga banyak yang penting, misalnya keahlian networking, programming, crypto, forensic, dsb tapi RE menjadi dasar bagi banyak hal dalam bidang security terutama tingkat lanjut. Dalam berbagai security CTF, nilai untuk RE dan pwning sangat tinggi dibanding challenge lain.

Penggunaan RE

Reverse engineering digunakan untuk banyak tujuan, ada yang baik dan ada pula yang kurang baik.

RE Untuk cracking program

Banyak orang mengenal RE untuk cracking program, baik itu berupa patch agar mendapatkan full version atau key generator untuk menghasilkan serial number yang valid.

RE untuk modifikasi program

Tidak semua bentuk modifikasi program berupa crack, berbagai modifikasi bisa dilakukan yang sifatnya positif misalnya:

  • Membetulkan bug program
  • Menambah fitur program (contoh yang sering ditemui adalah Game Mod).

Walaupun ada juga modifikasi yang sifatnya negatif, seperti misalnya menambahkan malware/backdoor/trojan/logger ke sebuah aplikasi.

RE untuk analisis security software komersial

Berbagai software legal ternyata menginstall rootkit. Sudah ada berbagai kasus terkait ini, misalnya kasus Sony, dan kasus terbaru saat ini di game Street Fighter.

Berbagai router dan benda IOT perlu direverse engineer untuk mengetahui cara kerjanya. Kadang pembuat device membuat backdoor, atau menyembunyikan fitur tertentu yang bisa diaktifkan.

RE untuk membuat exploit

Salah satu hal dasar yang dipakai bidang security adalah exploit. Para pentester memakai eksploit untuk masuk ke sistem, demikian juga para cracker. Exploit untuk berbagai OS komersial tertutup (Windows, OSX, iOS) pasti dihasilkan dari RE. Bahkan yang open source pun kadang butuh sedikit RE untuk membuat exploitnya (untuk memastikan berbagai address yang dihasilkan compiler).

RE untuk pentest

Sebagian mungkin menganggap: buat apa RE? bidang security saya nggak ada hubungannya dengan RE sama sekali: saya nggak ngurusin virus komputer ataupun malware. Saya cukup memakai exploit buatan orang saja. Saya nggak suka ikutan CTF yang ada reverse engineeringnya. Saya nggak akan membongkar software baru/router baru/device baru ataupun apapun yang berhubungan dengan IoT (Internet of Things). Saya nggak akan mengurusi web app yang memakai .NET ataupun Java (contoh pentester yang mengurusi kode low level .NET di aplikasi web). Saya nggak akan mempelajari protokol sebuah aplikasi. Saya juga nggak mengurusi mobile app untuk platform manapun. Karena itu semua keahlian RE buat saya nggak berguna.

Sekarang saya contohkan penggunaan RE satu bidang saja yang praktis dan dibutuhkan: mobile app. Sekarang ini dengan maraknya mobile device, keahlian RE untuk mobile app sangat dibutuhkan. Dari beberapa app yang saya test: tanpa RE, banyak bug bisa lolos.

Testing standar yang dilakukan banyak orang yang tidak melakukan RE adalah blackbox testing. Testing ini dilakukan dengan memonitor traffic dari device ponsel ke Wifi access point (dan mungkin menginstall dulu root cert di device jika protokolnya memakai SSL). Jika protokol yang dipakai adalah HTTP biasa (baik dengan SSL maupun tidak), maka langkah berikutnya adalah fuzzing (mencoba-coba sql injection dsb).

Teknik blackbox ini bisa gagal dalam banyak app. Pertama ada aplikasi yang memakai SSL Pinning, dan jika kita install root cert palsu, tetap tidak akan mau melakukan koneksi. Lalu meskipun protokolnya HTTP biasa (tanpa SSL sekalipun), jika aplikasi menggunakan HMAC untuk menandatangani requestnya, seperti ini:

aksi?a=1&b=2&hmac=xxyyzz

Jika kita berusaha mengganti satu byte saja, maka requestnya akan langsung ditolak tanpa HMAC yang benar. Jika kita tidak bisa mereverse engineer caranya menandatangani request tersebut, maka fuzzing tidak bisa dilakukan.

Apalagi jika ternyata protokolnya tidak memakai HTTP, tapi socket langsung, dan aplikasi menggunakan custom encryption (misalnya sekedar mengenkrip dengan AES dengan kunci yang tetap), maka blackbox testing tidak berguna sama sekali. Pernah ketemu aplikasi semacam ini di aplikasi mobile banking dan ternyata ada bug super penting di mana kita bisa mentransfer uang dari rekening orang ke rekening kita. Bug ini sebenarnya super konyol, jika memakai HTTP, requestnya kira-kira:

transfer?from=rekening1&to=rekening2&amount=1000

Tapi di sisi server tidak divalidasi bahwa rekening “from” adalah benar milik user tersebut (seorang user bisa punya beberapa rekening). Jika requestnya menggunakan HTTP dengan testing sedikit, bug ini akan ketahuan, tapi karena requestnya menggunakan socket dan paketnya formatnya tidak standar (bukan XML atau JSON), dan menggunakan enkripsi (AES), maka bug ini tidak tertangkap sampai cukup lama.

RE untuk analisis malware

Berbagai file yang kena ransomware berhasil didekrip karena ada kelemahan dalam enkripsinya, dan ini ditemukan dengan reverse engineering (dan tentunya ilmu kriptografi).

Malware yang sangat spesifik (misalnya yang digunakan untuk hacking Bank Sentral Bangladesh) harus dianalisis khusus, tidak akan ketemu oleh antivirus biasa. Malware yang tertarget (via email/web) untuk perusahaan tertentu juga perlu dianalisis secara khusus.

Berbagai exploit disebarkan via halaman web (via Javascript yang diobfuscate, memanfaatkan kelamahan Flash/Java/IE, lalu mengandung kode biner berisi shell code)

RE untuk analisis protokol dan algoritma

Berbagai protokol komunikasi software komersial (misalnya WhatsApp) berhasil dibongkar lalu diimplementasikan ulang dalam bentuk software open source.

RE dan cyberwar

Berdasarkan berbagai penggunaan RE di atas, saya berpendapat bahwa keahlian RE ini amat sangat penting untuk cyberwar/defense. Jika kita membeli semua software untuk bertahan dan menyerang, siapa yang tahu bahwa software yang kita beli itu tidak ada backdoornya jika tidak kita bongkar (RE)?. Beberapa waktu yang lalu ketika Hacking Team dijebol, baru diketahui bahwa software keamanan yang mereka jual (untuk menyadap/menyerang orang lain) ternyata ada backdoornya juga. Padahal client Hacking Team ini adalah lembaga pemerintah. Oh iya, dari bocoran Hacking Team, bisa dilihat juga bahwa harga sebuah exploit zero day mencapai ratusan juta rupiah (puluhan ribu dollar).

Legalitas RE

Tergantung penggunaannya dan hukum tempat Anda berada, RE bisa legal, illegal atau dalam area abu-abu. Penggunaan yang 100% legal misalnya: RE kode milik sendiri (baik individu ataupun perusahaan) yang source codenya hilang, RE untuk kompetisi (CTF), RE malware.

Beberapa yang masuk area abu-abu karena tergantung hukum dan interpretasi terhadap hukum tersebut: RE protokol untuk interoperabilitas, RE untuk mencari trade secret (rahasia dagang). Bahkan kadang RE untuk bidang security bisa masuk ke area abu-abu, sudah ada beberapa kasus di mana security researcher bermasalah dalam mencari dan atau mempublikasikan bug yang ditemukan.

Yang jelas masuk dalam kategori illegal adalah RE untuk cracking software, baik itu dengan patching ataupun dengan membuat key generator.

Cara belajar RE

Ada banyak cara untuk belajar sesuatu, dan tidak ada cara terbaik bagi siapapun untuk belajar sesuatu. Akan saya tunjukkan setidaknya beberapa pendekatan untuk belajar RE.

Sebagian orang akan langsung mengikuti tutorial cracking software. Hasilnya beragam: ada yang sudah memiliki dasar komputer yang baik (assembly, C, dsb) dan langsung bisa memahami prosesnya, serta bisa langsung mengcrack program lain. Ada yang bisa mengikuti tutorialnya, dan berhasil membongkar program serupa, tapi ada juga yang langsung gagal ketika programnya berbeda sedikit saja.

Ada orang yang belajar dari buku, hasilnya pun beraneka ragam. Berbeda dengan tutorial yang sifatnya pendek dan jelas, sebuah buku akan memberikan dasar teori yang lebih banyak. Karena bidang RE sangat luas, ada banyak buku dengan fokus tertentu saja, dan tiap buku bisa ratusan hingga ribuan halaman. Contohnya: buku RE malware yang hanya membahas Windows bisa mencapai 800 halaman. Dari beberapa orang yang memakai pendekatan ini, kebanyakan menyerah di tengah jalan.

Cara yang biasanya berhasil ada kombinasi dari kedua hal di atas: praktik plus teori. Jika Anda sudah punya dasar komputer yang cukup baik, maka bisa langsung praktik, jika mentok baca lagi teorinya. Jika belum punya dasar komputer yang baik, Anda sebaiknya belajar dulu dasar-dasarnya.

Ilmu dasar

Saya tidak akan membahas berbagai ilmu dasar untuk bisa melakukan RE, saya hanya akan memberikan daftarnya saja. Anda bisa mempelajari dasar ilmu ini baik dari buku, kuliah online, maupun materi dari Youtube.

Keahlian dasar komputer

Anda perlu tahu berbagai hal dasar sekali. Saya tidak akan mau ditanya: bagaimana menginstall program X, bagaimana mengekstrak file yang dikompres (dengan zip/7z/rar, dsb). Anda perlu tahu bagaimana menginstall driver, menginstall SDK, mencari tutorial (menggunakan Google) bagaimana cara mengcompile sesuatu. Jika berurusan dengan OS selain desktop -- misalnya ketika reversing Android --, Anda perlu tahu bagaimana menghubungkan benda tersebut ke desktop, bagaimana mengekstrak APK, melakukan rooting terhadap device, dsb.

Basis bilangan

Anda akan banyak menemukan penggunaan bilangan basis 2, 10 dan 16 serta terkadang basis 8. Jangan kaget ketika di kode program Anda menulis angka 200 (desimal) dan ketika melihat listing disassembly Anda melihat c8 (heksadesimal).Selagi belajar ini, coba juga tengok tabel ASCII. Berbagai karakter akan menjadi bilangan di assembly (misalnya if (c=='\n') bisa menjadi cmp al, 0xa).

Dasar Arsitektur komputer

Biasanya materi dari kuliah Arsitektur Komputer sudah cukup. Akan lebih baik jika Anda mengerti konsep abstraknya juga (biasanya dari kuliah teori bahasa dan automata), misalnya mengenai konsep mesin turing.

Dasar pemrograman

Untuk reverse engineering sederhana, kemampuan programming dasar diperlukan. Untuk reverse engineering yang lebih rumit, ilmu pemrograman yang dibutuhkan juga semakin tinggi. Andaikan Anda tidak bisa memprogram secara terstruktur baik, minimal kemampuan membaca source program sangat dibutuhkan.

Dalam beberapa kasus -- misalnya reverse engineering Android -- kita (biasanya) bisa mendapatkan source code dengan decompiler. Di titik ini Anda perlu membaca source code Java. Jika Anda tidak punya dasar Java sama sekali, Anda akan kesulitan memahami source codenya. Ini berlaku juga untuk berbagai bahasa/teknologi lain.

Ilmu lanjut

Ketika melakukan RE, Anda akan bertemu dengan berbagai topik tingkat lanjut. Ini tidak diperlukan di bagian awal, tapi kemungkinan besar akan Anda temui ketika berusaha mengcrack suatu program atau ikut sebuah CTF.

Enkripsi

Hampir semua game dan aplikasi serius memiliki proteksi dalam bentuk enkripsi. Jadi Anda perlu tahu dasar berbagai enkripsi sederhana, minimal cara kerjanya. Jika Anda ingin membongkar ransomware -- sebuah software yang menyandera user dengan mengenkrip datanya -- Anda perlu belajar enkripsi tingkat lanjut, yang meliputi mencari kelemahan dalam implementasi enkripsi.

Networking

Kebanyakan program yang memakai jaringan akan menggunakan HTTP dengan data dalam JSON/XML. Program tertentu akan memakai protokol khusus. Pemahaman akan protokol jaringan, bagaimana melakukan intercept dsb akan sangat berguna.

Tujuan dan Pendekatan buku ini

Tujuan buku ini adalah supaya pembaca dapat memahami proses RE, supaya bisa dipakai di berbagai situasi dan teknologi. Setiap pekerjaan RE adalah hal yang berbeda, sangat tergantung pada banyak hal: Arsitektur CPU, format file, sistem operasi, bahasa pemrograman dll. Secara berkala akan ada update terhadap bahasa pemrograman (ada fungsi baru, fitur baru), terhadap sistem operasi (berbagai macam hal low level bisa berubah). Bahkan CPU bukan hal yang konstan, tiap beberapa tahun ada instruksi baru yang ditambahkan.

Untuk menggambarkan secara detail setiap kombinasi sistem operasi, CPU, bahasa pemrograman akan memakan waktu sangat lama dan perlu diupdate sangat sering. Oleh karena itu buku ini tidak akan membahas banyak hal dengan sangat spesifik.

Pendekatan yang digunakan buku ini adalah gabungan dari beberapa buku lain: ada dasar teori, ada praktik, dan keduanya akan saya campurkan. Saya akan menunjukkan dulu transformasi dari level source code ke level assembly lalu sebaliknya. Dengan ini diharapkan pembaca bisa memahami secara dasar apa yang dihadapi oleh seorang reverser.

Berikutnya saya akan membahas topik-topik lain seperti debugging.

Copyright © 2009-2018 Yohanes Nugroho