NPM : 2206081194
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
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
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.