Anda di halaman 1dari 9

Nama : Ilham Abdillah Alhamdi

NPM : 2206081194

Return Oriented Programming

A. Ringkasan Isi Video


1. Video “Exploiting Return Oriented Programming (ROP) tutorial - Binary
Exploitation PWN101”
Pada video tersebut dijelaskan terkait konsep dan praktik Return Oriented
Programming (ROP). Teknik ROP merupakan teknik eksploitasi biner modern yang
dapat mem-bypass Data Execution Protection (DEP). Proteksi ini membatasi akses
pada segmen memori tertentu agar tidak dapat dieksekusi, seperti pada stack dan heap.
ROP memungkinkan kita memanfaatkan instruksi mesin yang sudah ada sebagai alat
eksploitasi.
Seperti namanya, ROP merupakan teknik pemrograman dengan memanfaatkan
instruksi return dari fungsi sebagai komponen utamanya. Teknik ini memanfaatkan
instruksi-instruksi yang berada sebelum instruksi ret. Kumpulan instruksi tersebut
disebut dengan ROP gadget. Agar menjadi kode yang diinginkan, beberapa ROP
gadget tersebut di-chaining satu sama lain sehingga seolah-olah menjadi satu kesatuan
rangkaian instruksi.
Seperti yang diketahui sebelumnya, bahwa instruksi ret memiliki behaviour
melakukan pop dari stack dan menyimpan hasilnya pada register rip atau eip untuk
kemudian melakukan jump. Oleh karena itu, dalam teknik ROP ini kita akan sangat
melibatkan stack di dalamnya. Dalam praktiknya, teknik ROP merupakan proses
menyusun address ROP gadget dan data sedemikian rupa di dalam stack sehingga
proses eksekusi instruksi sesuai dengan apa yang diinginkan. Untuk menemukan ROP
gadget yang tepat, beberapa tools berikut dapat membantu, seperti ROPgadget,
Ropper, dan Radare2.
B. Ringkasan Praktik

1. ROP - Split Challenge


Dalam sesi ini, dilakukan praktik untuk mencoba teknik ROP terhadap file binary berikut:
split. Objective utama dalam praktik kali ini adalah untuk mendapatkan flag dari flag.txt
dengan memanfaatkan usefulFunction dan usefulString yang diberikan. Berikut
merupakan detail praktik yang dilakukan.
● Mengecek proteksi yang digunakan dalam binary file yang akan dieksploitasi.
Command : checksec split

NX enabled artinya stack not executable atau menggunakan Data Execution


Protection. Karenanya, kita perlu menggunakan teknik ROP.
● Mengidentifikasi alur program dan fungsi-fungsi dalam file dengan debugger.
Saya menggunakan Ghidra.

Garis besarnya, fungsi main memanggil fungsi pwnme . Di dalam fungsi pwnme ,
kita dapat memanfaatkan fungsi read untuk memasukkan payload ROP. Tujuan
kita adalah untuk call system dalam fungsi usefulFunction dengan input dari
usefulString. Adapun address dari fungsi system adalah 0x0040074b.
● Mengidentifikasi string yang dapat digunakan untuk eksploitasi

Command /bin/cat flag.txt akan berguna sebagai input untuk fungsi


system. Address string tersebut adalah 0x00601060.
● Mengecek padding yang diperlukan untuk mengisi payload ROP gadget. Pada
fungsi pwnme, variable buffer untuk fungsi read berada pada [rbp + -0x20].
Artinya kita perlu mengisi padding sebanyak 0x20 + 0x8 (rbp) = 0x28 bytes.
● Mencari ROP gadget yang dapat digunakan untuk memasukkan address
usefulString sebagai input ke fungsi system. Fungsi ini menerima satu
argumen berupa string sebagai command. Untuk itu, kita perlu mencari ROP
gadget yang bisa mengisi register RDI/EDI (argumen pertama) dengan address
usefulString . Karena kita memiliki kontrol atas stack, kita memerlukan
gadget yang melakukan pop rdi atau pop edi.
Dengan tools ROPgadget, kita dapat mencari gadget-gadget yang diinginkan.
Command : ROPgadget --binary split | grep ‘pop rdi’

Address dari gadget tersebut adalah 0x00000000004007c3


● Membuat script python untuk meng-generate payload. Script ini menggunakan
library pwntools.

2. PicoCTF 2018 - Rop Chain


Dalam sesi ini, dilakukan praktik untuk mencoba teknik ROP terhadap file binary berikut:
rop. Berikut merupakan detail praktik yang dilakukan.
● Mengecek proteksi yang digunakan
Command : checksec rop

NX enabled artinya kita dapat menggunakan ROP untuk eksploitasi. Dengan


informasi NO PIE, artinya address instruksi tidak akan diacak dalam setiap
eksekusi (fixed).
● Mengidentifikasi alur program dan fungsi-fungsi di dalam file biner.

Fungsi target kita adalah fungsi flag. Untuk menampillkan flag.txt, fungsi ini
memerlukan variabel win1 dan win2 bernilai true dan parameter pertama
bernilai 0xbaaaaaad.
Variabel win2 di-set sebagai true di fungsi win_function2 dengan syarat
variabel win1 bernilai true dan parameter pertama bernilai -0x45555553.
Variabel win1 di-set sebagai true di fungsi win_function1.
Artinya, urutan pemanggilan fungsinya adalah : win_function1 →
win_function2 → flag. Kita dapat memanfaatkan fungsi gets pada vuln
untuk memasukan payload ROP gadget yang kita butuhkan.
● Mengecek padding yang diperlukan untuk mengisi payload ROP gadget. Pada
fungsi vuln, ukuran buffer untuk gets disediakan sebesar 0x18 = 24 bytes.
Oleh karena itu, padding yang diperlukan adalah 24 + 4 (rbp) = 28 bytes.
● Membuat payload untuk rangkaian ROP gadget.
Perhatikan detail instruksi pada beberapa fungsi berikut
○ win_function1

Pada stack, hanya terjadi push dan pop register ebp. Tidak ada yang
perlu diperhatikan berkaitan dengan pembuatan payload.
○ win_function2

Terdapat pengecekan variabel pada [ebp+0x8] dengan nilai


0xbaaaaaad. Artinya, nilai parameter yang akan dicek perlu ditempatkan
setelah nilai ebp yang baru di-push, sejauh 0x8 bytes.
○ flag

Terdapat pengecekan variabel pada [ebp+0x8] dengan nilai


0xdeadbaad. Parameter perlu ditempatkan 0x8 byte setelah ebp.
Berikut merupakan konstruksi payload sementara :
- [28 bytes] padding
- [4 bytes] win_funtion1
- [4 bytes] win_function2
- [4 bytes] xxx
- [4 bytes] 0xbaaaaaad (parameter win_function2)
- [4 bytes] flag
- [4 bytes] [don’t care]
- [4 bytes] 0xdeadbaad (parameter flag)
- [1 byte] “\n” (newline untuk fungsi gets)

Nilai xxx perlu diisi dengan alamat gadget yang berisi instruksi pop sebanyak
satu kali agar nilai 0xbaaaaaad seolah-olah ‘dihapus’ dari stack. Dengan begitu,
nilai 0xbaaaaaad tidak dianggap sebagai return address.
● Mencari ROP gadget pop
Command: ROPgadget --binary rop | grep -E 'pop [a-z]{3} ;
ret

Kita dapat memanfaatkan instruksi pop ebp ; ret pada address 0x080485d6
untuk melewatkan 4 bytes. Nilai dari register ebp tentunya sudah rusak / tidak
relevan semenjak kita melakukan ROP. Oleh karena itu, menulis di register ebp
tidak akan mengganggu jalannya ROP.
● Menyempurnakan payload
Berikut merupakan konstruksi payload final:
- [28 bytes] padding
- [4 bytes] win_funtion1
- [4 bytes] win_function2
- [4 bytes] gadget ”pop ebp ; ret”
- [4 bytes] 0xbaaaaaad (parameter win_function2)
- [4 bytes] flag
- [4 bytes] [don’t care]
- [4 bytes] 0xdeadbaad (parameter flag)
- [1 byte] “\n” (newline untuk fungsi gets)
Berikut merupakan hasil akhir praktik
C. Refleksi
Materi terkait ROP ini sangat menarik, seperti menyusun berbagai kepingan puzzle. Dari praktik
yang telah dilakukan, saya tidak merasa kesulitan. Tentu saja, hal yang menjadi challenge dari
materi ini adalah bagaimana menyusun gadget sedemikian rupa hingga menjadi rangkaian
instruksi yang berguna. Saya penasaran bagaimana jika jenis proteksi lain digunakan juga.
Apakah akan tetap mudah? Tentunya saya cukup senang karena semakin hari, problem yang
diselesaikan semakin advance dan modern.

Anda mungkin juga menyukai