Kali ini saya akan berbagi Write Up dari salah satu soal di IDCC Ctf 2018 yang baru saja berakhir. Selamat membaca~
Langsung saja soal kali merupakan soal Binary Exploit. Diberikan sebuah service pada server dan program ELF 32-bitnya yang bisa didownload disini.
Langkah pertama yang dilakukan langsung saja lakukan reversing menggunakan IDA Pro. Lalu lihat pada bagian pseudocodenya. Kira-kira akan tampil seperti ini:


Bisa dilihat dari hasil diatas, inputan akan dibaca menggunakan scanf yang dibatasi hanya membaca inputan sepanjang 128 char. Program akan menampikan string "Congratulions!" dan Flag jika nilai dari variabel secret adalah 48879. Jika tidak maka program hanya akan menampilkan nilai dari variabel secret dan string "hahaha... shame". Nah, sekarang kita tahu bahwa tujuan dari soal ini adalah mengubah nilai dari variabel secret menjadi nilai tertentu yang pada kesempatan kali ini bernilai 48879. Tapi, dari inputan yang disediakan tidak bisa untuk mengubah nilai dari variabel secret. Bagaimana caranya ya? hm, Kita coba jalankan dulu servicenya pada sisi server.

Terlihat bahwa input yang kita masukkan akan ditampilkan ulang oleh program. Hm, bagaimana kalau kita coba memberi inputan lebih dari 128?

Hm, ternyata yang tampilkan tetap saja 128 char awal yang kita masukkan. Hm, setelah melihat ulang hasil reverse dari IDA Pro tadi seksama ternyata pada bagian scanf hanya memberikan batas inputan yang dibaca, tapi menentukan jenis inputan atau format dari masukkan. Nah, ini bisa dimanfaatkan untuk melakukan exploit menggunakan celah itu yang disebut format vulnebilities. Jadi kita bisa menentukan sendiri jenis format yang ingin dimasukkan yang kemudian ditampilkan oleh program. Untuk mengeceknya apakah benar service ini memiliki celah tersebut kita coba masukkan %x untuk menampilkan nilai hexadecimal, yang jika dimasukkan seharusnya menampilkan alamat memory dari service. Langsung saja kita coba.

Nah, seperti dugaan kita sebelumnya ternyata benar bahwa service ini mempunyai format vulnebilities. Selanjutanya kita cari alamat memory yang akan menampung inputan kita. Caranya dengan memasukkan beberapa huruf yang diikuti dengan beberapa %x. Kali ini saya menggunakan python agar lebih mudah membuat payloadnya.

Bisa dilihat pada saat saya memasukkan 4x huruf 'A' yang diikuti 7x "%x " pada bagian akhir muncul nilai 41414141 yang merupakan bentuk hexadecimal dari huruf 'A'. Nah, sekarang kita sudah dapat posisi alamat memory yang menampung inputan kita. Selanjutnya adalah kita ubah inputan kita dengan alamat memory dari nilai variabel secret, karena kita akan mengubah nilai variabel tersebut. Cara mencarinya gunakan perintah pada linux 'objdump -t format_playing' lalu akan muncul alamatnya seperti dibawah ini:

Nah, terlihat bahwa alamat dari variabel secret adalah '0804a034'. Sekarang kita ubah inputan kita yang tadinya 4x 'A' menjadi alamat itu. Kita gunakan python lagi, lalu karena nilai dari alamat memory menggunakan little endian maka tulisan dibalik. Langsung saja kita coba lagi.

Nah, pada bagian akhir sekarang sudah muncul alamat memory dari variabel secret, sekarang kita coba ubah nilai dengan cara mengubah '%x' yang terkahir menjadi '%n'. Seharusnya sekarang nilai dari secret berubah.

Seperti yang kita harapkan sekarang nilai dari variabel secret sudah berubah, tapi nilainya belum sesuai dengan yang diinginkan. Kita bisa mengaturnya dengan cara memberikan nilai pada '%x' yang mana nilai tersebut adalah pengurangan dari nilai yang diinginkan dengan nilai yang sekarang. Maka 48879 - 43 = 48836. Sekarang kita coba udah nilainya.


Nilai dari secret sudah berubah, tapi masih belum sesuai. yang mana sekarang selisih nilainya tinggal 9. Kita tambahkan saja dengan nilai sebelumnya menjadi 48845. Sekarang kita coba lagi.


Sudah muncul tulisan Congratulations!, coba kita scroll ke atas maka akan muncul flagnya.
Flag : IDCC{M4nipulat1n9_F0rm4t_for_pR0f1T_$$$}
Sekian, terima kasih sudah menyimak sampai akhir. Silakan berikan kritik & saran kepada penulis, karena penulis juga masih belajar. :)

0 komentar:
Posting Komentar