[Swampctf2018] – Apprentice Return

 

Binary challenge ini dapat didownload pada link ini.

Oke, jadi seperti biasa kita mengecek file dan checksec dari binary.

Semua security nya default hanya NX enabled. Sekarang kita coba jalankan programnya.

Ketika dijalankan, program akan melakukan print paragraf dan meminta input. Ketika input asal test dijalankan, program kembali mengeluarkan narasi cerita yang menyedihkan ketika jagoan kita kabur dan program akan exit setelah selesai print.

Lalu saya cek dengan IDA, ternyata pada main hanya memanggil sebuah function lain bernama doBattle.

Inilah pseudocode function doBattle

Ketika saya amati, ternyata input dibaca oleh read. Terdapat if yang membandingkan retaddr terhadap 0x8048595. kita dapat melihat bahwa ketika retaddr > 0x8048595 maka program akan mengeluarkan print yang persis dengan test yang kita jalankan di atas dan melakukan exit program. Maka dapat kita simpulkan bahwa variable retaddr ketika kita menjalankan test program tadi lebih besar dari 0x8048595. Lalu ketika kita mempunyai retaddr yang lebih kecil dari 0x8048595 maka akan diprint sebuah paragraf lain bahwa kita sudah meneukan kelemahan dari beast. Saya memperkirakan bahwa itu adalah kunci kita mengalahkan program ini (beastnya)  dan kita harus memiliki variable retaddr yang lebih kecil dari 0x8048595.

Selain doBattle, ada function bernama slayTheBeast yang memiliki cat flag di dalamnya. 

Dari informasi yang saya dapatkan sejauh ini, kita mendapatkan clue dari judul mengenai return, lalu kita punya function slayTheBeast yang bisa membuka flag kita. Berarti, kita harus  melakukan return ke function slayTheBeast. Namun, dari function doBattle, tidak ada tanda tanda return yang bisa kita isi dengan pointer ke slayTheBeast. Namun saya belum melihat celah untuk terjadinya ROP.

Jadi agar lebih jelas mari kita buka function doBattle dengan gdb

Terlihat di  tanda kuning terdapat beberapa hal yang menarik. pertama, setelah kita melakukan input, sebuah pointer akan diletakkan pada eax yang nantinya dipindahkan ke edx setelah itu eax kita akan berisi 0x8048595 lalu edx yang berisi pointer dari inputan tersebut dicompare dengan eax tadi. Setelah itu dilakukan jbe (jump below equal). Berarti ini adalah bagian dari if(retaddr >  0x8048595) dan kita tahu bahwa nilai yang dicompare adalah edx dan edx disimpan dalam stack.

Maka kita mendapatkan clue lagi yaitu kita melakukan overflow dan melakukan overwrite terhadap edx agar valuenya dibawah  0x8048595. Namun kita masih belum tahu apa yang dapat kita lakukan lebih lanjut. Saya melakukan pattern create dan menginput ke dalam program dengan gdb lalu saya dapat mengecek offset edx.

Sekarang kita tahu bahwa offset dari edx itu mulai dari 42. kita tahu bahwa edx tadi berisi pointer yang dibandinkan dengan 0x8048595. coba kita overwrite edx dengan 0x01 saja dan lihat apa yang terjadi.

Dapat kita lihat bahwa kita sudah sampai ke condition jbe. Namun apakah yang bisa kita lakukan di sini? Jika kita teliti, maka kita akan menyadari bahwa apabila kita memasukkan EDX dengan gadget ret , maka kita dapat melakukan return ke function manapun yang kita mau. Maka yang harus lakukan adalah mencari gadget return yang mempunyai address lebih kecil dari 0x8048595.

Kita dapat melakukannya dengan command find pada gdb peda

Namun saat pertama kali saya mencari secara spesifik ‘ret:’, yang muncul adalah alamat stack yang lebih besar dari 0x8048595 sehingga tidak dapat kita gunakan, sekarang kita coba cari dengan menggunakan ropper.

Terlihat bahwa ret terakhir memenuhi syarat karena 0x0804835a < 0x8048595 sehingga kita dapat menggunakan address return tersebut.

Setelah mendapat address return, kita hanya butuh melakukan return ke function slayTheBeast saja lalu kita coba jalankan.

Remote service dari challenge ini masih dapat diakses melalui nc chal1.swampctf.com 1802, namun ketika saya sudah melakukan exploit dengan benar (sudah kita coba tadi dan sudah dipastikan dengan writeup yang ada), saya tidak dapat flagnya sehingga saya memasukkan flagnya ke dalam local process saja.

flag = flag{f34r_n0t_th3_4nc13n7_R0pn1qu3}

 

Leave a Reply

Your email address will not be published. Required fields are marked *