Anda di halaman 1dari 21

Requirement:

● Memahami konsep pemrograman


● Sedikit memahami bahasa assembly
● Mengerti bahasa C
● Mengenal linux dan beberapa commandnya

APA ITU BINARY EXPLOITATION

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

v Push <parameter n>

w Push <parameter 2>

x Push <parameter 1>

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.

<- call <fungsi> (push z)

<- push <parameter 1>

<- push <parameter 2>

<- push <parameter n>


Layout stack milik binary 64-bit, sedikit berbeda dengan milik binary 32-bit. Ketika
binary 32-bit memasukkan parameter parameter fungsi yang akan digunakan fungsi
yang dipanggil ke dalam stack, binary 64-bit melakukanya dengan cara memasukan
parameter tersebut ke dalam register seperti RDI, RSI dan lainnya menggunakan
instruksi ​mov​. Contoh:
Mov rdi , <parameter 1>
Mov rsi , <parameter 2>
.
.
Call <fungsi>

Sehingga layout stacknya adalah sebagai berikut.


TOOLS

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

Selengkapnya bisa di lihat di ​sini

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.

Parameter 2 \x44(D) \x43(C) \x42(B) \x41(A)

Address: x \x48(H) \x47(G) \x46(F) \x45(E)

Parameter 1 \x00 \x00 \x00 \x00


Address: x+8

Mengapa isi dari parameter 2 terbalik?


Karena metode penyimpanan data di dalam memory ini adalah dengan sistem little-endian.
Penjelasannya ada di ​sini

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

Parameter 2 \x44(D) \x43(C) \x42(B) \x41(A)

Address: x \x48(H) \x47(G) \x46(F) \x45(E)

Parameter 1 \x52(L) \x51(K) \x50(J) \x49(I)


Address: x+8

Berarti nilai parameter 1 berubah menjadi 0x49505152, yaitu 1230000466 desimal

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]​.

Jika digambarkan, maka akan menjadi seperti berikut.

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

Kita berhasil memodifikasi nilai dari modified.

Penampakan di stack:

esp

esp+0x1c \x41(A) \x41(A) \x41(A) \x41(A)

. \x41(A) \x41(A) \x41(A) \x41(A)

esp+0x5c \x42(B) \x42(B) \x42(B) \x42(B)

Nilai modified berubah menjadi 0x42424242

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.

Analisis dengan gdb.


Fungsi lain yang juga vulnerable terhadap serangan buffer overflow adalah ​strcpy​. Sehingga
kita bisa memanfaatkan fungsi ini.

Kondisi stacknya sama dengan stack0, jadi langsung aja.

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.

Data yang kita butuhkan untuk exploit adalah:


1. Address fungsi ​win()
2. Address stack ​return address
3. Address stack ​buffer

Untuk mendapatkan data tersebut, gunakan gdb.


1. Address fungsi ​win()

Address fungsi ​win() ​= ​0x080483f4


2. Address stack ​return address
Ketika mempelajari layout stack sebelumnya, dapat kita ketahui bahwa return address
akan langsung di-​push​ ke dalam stack ketika instruksi ​call ​dijalankan. Sehingga, kita
akan mengambil address stack return address setelah instruksi ​call ​dijalankan, yang
berarti addressnya pada saat itu terletak di puncak stack. Dalam hal ini, karena exploit
akan dijalankan di fungsi ​main()​, kita bisa langsung melihatnya ketika masuk ke fungsi
main.
Di gdb, fungsi ​main()​ di break, agar program terhenti ketika masuk ke fungsi ​main()​,
Lalu jalankan program.
Address stack ​return address​ = ​0xffffd19c
3. Address stack ​buffer
Untuk mencari address stack ​buffer ​ini, dapat kita lakukan dengan cara
memberhentikan program setelah variable ​buffer ​telah kita isi input, yaitu di instruksi
setelah ​gets(buffer) ​dijalankan.

Lalu, ketika program dijalankan, masukkan inputnya. Maka hasilnya adalah


Address ​buffer ​= ​0xffffd150

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,

Berhasil masuk ke fungsi ​win()

Anda mungkin juga menyukai