Binary exploitation adalah sebuah proses memanfaatkan kelemahan dari suatu binary sebagai
keuntungan untuk penyerang.
Binary exploitation adalah sebuah proses menggunakan suatu fitur dengan cara yang tidak
semestinya agar fitur tersebut tidak bekerja dengan semestinya.
Binary exploitation bekerja dengan prinsip menggunakan bug atau kelemahan yang terdapat
pada sebuah aplikasi, untuk menyebabkan kejadian yang tidak terantisipasi oleh developer atau
pembuat aplikasi tersebut
LAYOUT MEMORY
Untuk mempelajari Binary Exploit, maka kita harus mengenal dulu layout memory dari
binary dalam hal ini dalam bentuk ELF (Executable and Linkable Format). Karena ketika
menjalankan sebuah binary, binary tersebut akan di-load ke dalam memory. Memory ini
juga bisa dibagi ke 2 jenis, 32-bit dan 64-bit, yang layout memorynya berbeda, yang
berarti proses eksploitasinya akan menjadi berbeda pula.
Berikut adalah layout memory setelah binary 32-bit di load ke memory.
Berdasarkan gambar diatas, layout memory binary 32-bit tanpa proteksi ASLR (Address
Space Layout Randomization) terdiri dari segmen sebagai berikut:
1. Segmen ELF
a. Segmen .text
Berisi instruksi instruksi milik binary (ELF) dalam bahasa assembly.
contoh: mov eax,2
b. Segmen .data
Berisi variabel-variabel global pada binary yang diinisiasikan.
c. Segmen .bss
Berisi variabel-variabel global pada binary yang tidak diinisiasikan.
2. Heap
Tempat penyimpanan data dinamis, yang biasanya digunakan ketika membuat
sebuah objek baru, dan atau fungsi malloc() dipanggil. Dalam pembentukannya,
heap dimulai dari address yang tinggi ke yang lebih rendah (ke bawah).
3. Stack
Tempat penyimpanan variable lokal dalam suatu fungsi, termasuk urutan
pemanggilan fungsinya. Dalam pembentukannya, stack dimulai dari address
yang rendah ke yang lebih tinggi (ke atas).
4. Argv , Environment variable
Tempat disimpannya Argv (Parameter yang diberikan ke binary), dan
Environment Variable (variabel-variabel yang dimiliki oleh OS yang
mengeksekusi binary)
5. Kernel Space
Bagian memory yang dikhususkan untuk kernel, sehingga tidak bisa digunakan
oleh binary
Pada proses binary exploit, yang akan kita analisa biasanya adalah segmen Heap dan
Stack. Tapi sudah pasti akan ada binary yang diproteksi oleh ASLR. Hal ini
menyebabkan tingkat kesulitan dalam eksploitasi bertambah.
ASLR(Address Space Layout Randomization) adalah salah satu jenis proteksi yang
terdapat pada binary. Cara kerjanya adalah dengan memberikan offset yang nilainya
random sebelum address awal heap dan stack. Sehingga address posisi data atau
variable di heap dan stack itu menjadi tidak tetap, yang menyulitkan proses eksploitasi
Selain mengetahui layout memory, kita juga harus mengetahui layout pada stack.
Misalkan pada sebuah binary, terdapat fungsi main yang memanggil sebuah fungsi
yang urutan instruksinya adalah: fungsi(param 1, param 2 ,param n)
alamat instruksi
y Call <fungsi>
z ...
Sifat stack adalah mengisi dari rendah ke yang lebih tinggi, jadi parameter n akan
dimasukkan di stack paling rendah, lalu parameter 2, lalu parameter 1.
Sedangkan ketika call <fungsi> dijalankan, juga akan dilakukan push ke dalam stack,
tapi yang di push ke dalam stack adalah alamat yang akan dieksekusi setelah proses
call, dalam hal ini alamat z. Agar setelah fungsi selesai dieksekusi, program akan
dilanjutkan ke alamat tersebut.
Setelah masuk kedalam fungsi, binary akan membentuk stack frame baru, yaitu stack
sementara yang akan digunakan hanya untuk fungsi itu sendiri. Caranya adalah dengan
membuat dasar dari stack frame tersebut dengan melakukan push EBP (base pointer).
Pada awalnya nilai ESP akan sama dengan EBP. Namun, ketika parameter parameter
yang dibutuhkan fungsi yang sudah ada di stack akan di push ke dalam stack frame,
Nilai ESP akan naik, sehingga EBP menjadi batas bawah stack frame. Dan ESP
menjadi batas atas stack frame.
sehingga layout stack pada binary 32-bit menjadi sebagai berikut.
Berikut adalah beberapa tools maupun plugin yang sering digunakan dalam binary exploit.
DISASSEMBLER / DEBUGGER
Untuk menganalisa binary. Beberapa tools yang penulis gunakan adalah:
1. IDA
Ini dapat digunakan untuk disassembly atau debugging. Versi gratisnya dapat di
download di sini . versi freenya hanya bisa digunakan untuk binary 64-bit
2. BINARY NINJA
Fungsinya tidak jauh berbeda dengan IDA, namun untuk melakukan patching di binary,
lebih mudah dilakukan dengan tool ini. Versi gratis/demo nya dapat di download di sini .
versi demo hanya bisa digunakan untuk binary 32-bit
3. GDB-PEDA
Ini adalah plugin dari gdb, yang membuat gdb lebih berwarna dan mudah untuk di
gunakan. Di linux, jika belum ada langsung dapat di ambil dari repository, dengan
command sudo apt-get install gdb.
Jika sudah punya, step penginstalan nya bisa di lihat di sini
Untuk cara menggunakannya, dapat dilihat pada Modul Reverse Engineering
4. RADARE2
Ini adalah framework yang digunakan untuk reverse-engineering dan analisis binary.
Radare2 juga memiliki banyak utility yang dapat digunakan secara independen. Radare2
ini berbasis CLI (Command Line Interface)
PYTHON
Untuk membuat script. Pada OS linux, bisa diinstall dengan command sudo apt-get install
python2. Biasanya script dibuat dengan python versi 2
PWNTOOLS
Module python yang akan sering digunakan untuk binary exploit. Ketika sudah menginstall
python, install pwntools dengan command sudo pip install pwntools.
Cara pemakaiannya bisa dipelajari di sini
ROPGADGET
Tool yang digunakan untuk mencari gadget-gadget pada metode Return Oriented Programming
yang akan dibahas nantinya
PROTEKSI
Ketika melakukan binary exploit, kita akan menemukan beberapa jenis proteksi yang diterapkan
pada binary, beberapa diantaranya adalah
1. CANARY
Canary adalah proteksi yang memastikan tidak terjadinya buffer overflow pada binary
2. NX
NX adalah proteksi yang membuat stack dapat di akses, tapi tidak dapat dieksekusi.
Sehingga tidak mungkin melakukan shellcode injection kedalam stack lalu
mengeksekusinya.
3. FORTIFY
Fortify adalah proteksi yang memastikan tidak dapat terjadinya format string attack pada
binary
BUFFER OVERFLOW
Setelah memahami tentang layout stack, kita tahu, bahwa nilai nilai parameter yang ada pada
suatu fungsi akan diletakkan berdekatan ketika dimasukkan di stack. Hal ini lah yang akan kita
manfaatkan untuk melakukan buffer overflow exploit.
Misal:
Pada sebuah binary 32-bit, ada sebuah fungsi yang membutuhkan 2 parameter untuk
menjalankan fungsi tersebut. Anggap saja parameter 1 nilainya adalah 0 dan parameter 2
adalah sebuah array of char yang panjangnya 8 elemen dan isinya adalah ABCDEFGH. Maka
ketika masuk ke dalam fungsi tersebut, keadaan stacknya kurang lebih seperti ini.
Lalu apa yang terjadi kalau kita beri input lebih dari 8 elemen? Contohnya ABCDEFGHIJKL
Yang terjadi adalah parameter 2 akan tetap memasukkan semua input miliknya, sehingga
mengakibatkan nilai parameter 1 ter-overwrite. Inilah yang dinamakan dengan Buffer
Overflow.
Latihan1
Binary: stack0
Setelah membaca dan memahami program c ini, yang akan kita lakukan adalah memodifikasi
nilai dari modified menjadi nilai apapun selain 0. Mari kita analisis menggunakan gdb.
Jika di cocokkan dengan sourcecode yang tersedia, maka int modified ini akan sama dengan
mov DWORD PTR [esp+0x5c],0x0 yang berarti modified sama dengan [esp+0x5c]. Dan
gets(buffer) akan sama dengan call 0x804830c <gets@plt>, dengan parameter buffer yang
sama dengan [esp+0x5c].
esp
esp+0x1c
esp+0x5c
Salah satu function yang dapat mengakibatkan terjadinya buffer overflow adalah gets, yang
membuat kita dapat memasukkan input sepanjang apapun ke dalam stack.
Karena bisa terjadi buffer overflow, sekarang kita akan mencoba untuk mengganti nilai dari
modified, yang berada di bawah buffer di stack. Caranya adalah dengan menghitung panjang
input yang dibutuhkan untuk mencapai address modified, yaitu 0x5c-0x1c=0x40=64 desimal.
Berarti kita akan memasukkan input sepanjang 64 karakter, ditambah dengan nilai untuk
modified.
Gunakan python
Penampakan di stack:
esp
Bagaimana jika kita harus mengganti nilai modified menjadi nilai tertentu serta memakai jenis
inputan yang berbeda?
Latihan2
Binary:stack1
Setelah memahami program ini, dapat disimpulkan bahwa kita harus mengganti nilai modified
menjadi 0x61626364. Kalau yang tadi kita memasukkan input didalam binary, stack1 ini
memasukkan inputan berupa argumen.
Karena kita ingin membuat nilai modified menjadi 0x61626364, kita harus memberi inputan tiap
byte dalam little-endian. Sehingga bentuknya akan menjadi \x64\x63\x62\x61.
Gunakan python.
Untuk inputan yang berupa argumen ini, gunakan simbol ` (di bawah esc keyboard QWERTY)
untuk menjalankan command bash di argumen
Latihan3:
Binary:stack2
Pada binary ini, vulnerability nya terdapat pada strcpy(buffer,variable),sehingga kita akan
menggunakan variabel variable untuk melakukan buffer overflow. Nilai variable diperoleh dari
fungsi getenv(“GREENIE”), yaitu mengambil environment variable yang bernama GREENIE
dari OS masing masing.
Kondisi stacknya juga sama dengan yang sebelumnya, yaitu 64 karakter ditambah nilai byte
untuk mengubah modified, yaitu \x0a\x0d\0x0a\x0d
Untuk melihat environment variable apa saja yang ada di OS Linux masing masing, gunakan
command env.
Kita juga bisa menambahkan environment variable sendiri, dengan menggunakan command
export.
RETURN ORIENTED PROGRAMMING (ROP)
ROP adalah jenis exploit yang memanfaatkan return address yang di simpan pada stack, untuk
mengubah alur berjalannya program sesuai keinginan penyerang.
Exploit ini dapat dilakukan dengan beberapa cara, salah satunya adalah dengan menggunakan
buffer overflow. Jika sebelumnya yang kita overwrite adalah nilai sebuah variable, maka yang
kita overwrite sekarang adalah return address yang disimpan pada stack
<-yang itu
Caranya kurang lebih sama, yaitu mencari address stack disimpannya return address,
dan mencari address stack variable yang akan di exploit.
Latihan3:
Binary:stack4
Yang akan kita lakukan adalah membuat alur program berubah, dari yang awalnya start->fungsi
main-> end , menjadi start -> fungsi main -> fungsi win.
Karena semua data sudah berhasil kita ambil, sekarang saatnya kita membuat script
exploit. Sekarang saya akan memakai python dan modulenya, pwntools.
Dan ketika script dijalankan,