heap 0 - Binary Exploitation
Last updated
Was this helpful?
Last updated
Was this helpful?
Challenge ini bisa diakses melalui: https://play.picoctf.org/practice/challenge/438
Diberikan sebuah file binary ELF beserta source code-nya.
Ketika file ELF tersebut dieksekusi, maka akan menghasilkan output berikut:
Program ini sebenarnya adalah contoh implementasi alokasi data pada memori menggunakan heap dengan beberapa opsi:
Opsi 1: menampilkan lokasi dan isi memori pada status saat ini (current state).
Opsi 2: menuliskan data pada memori.
Opsi 3: menampilkan isi variabel pada memori.
Opsi 4: menampilkan flag.
Opsi 5: keluar program.
Jika dilihat dari source code-nya, terdapat fungsi check_win
yang akan menampilkan isi flag.
Di fungsi ini, untuk menampilkan flag, saya perlu memenuhi kondisi if (strcmp(safe_var, "bico") != 0)
yang artinya adalah: jika variabel safe_var
tidak berisi string "bico", maka eksekusi perintah di dalam block.
Kondisi ini hanya bisa dipenuhi dengan cara menimpa isi variabel safe_var
di memori, atau dengan kata lain melalui heap overflow. Untuk melakukan ini, saya perlu melihat terlebih dahulu apa yang sebenarnya dilakukan oleh opsi 2. Write to buffer
pada fungsi write_buffer
di source code.
Jika dilihat dari isinya, fungsi ini berisi perintah untuk menerima input user menggunakan fungsi scanf
. Dan jika melihat pada manual page fungsi scanf
melalui console menggunakan perintah man scanf
, ternyata fungsi ini memiliki bugs.
Fungsi scanf
tidak melakukan pemeriksaan jumlah buffer pada input yang diberikan, atau dengan kata lain akan memasukkan semua input data sampai karakter spasi ditemukan. Kondisi ini akan menimbulkan buffer overflow, ketika sebuah program mencoba menyimpan data yang melebihi kapasitas buffer atau blok memori yang sudah dialokasikan untuk menyimpan data tersebut. Dan ketika buffer terisi lebih dari kapasitasnya, data akan "meluber" ke area memori lain yang berdekatan, sehingga akan menimpa data lain.
Setelah mengetahui terdapat bug buffer overflow pada program ini, langkah selanjutnya adalah melakukan eksploitasi!!!
Karena saya sudah mengetahui terdapat bug buffer overflow pada program ini, maka saya akan men-triggernya melalui opsi 2. Write to buffer
.
Ketika saya mencoba memasukkan 40 karakter A
tanpa spasi sebagai input dan menampilkan status heap, data pada heap yang mulanya berisi string "bico" menjadi berisi karakater A
berjumlah 8.
Dari sini bisa disimpulkan bahwa variabel input_data
(untuk menerima input user) hanya dapat menyimpan buffer sebesar 33 bytes (32 bytes + null terminator). Ketika memasukkan input lebih dari itu, maka sisa karakter tersebut akan menimpa variabel terdekat yang ada di memori, yang di kasus ini adalah variabel safe_var
yang berisi string "bico." Karena untuk mendapatkan flag saya hanya perlu menimpa atau memodifikasi variabel safe_var
, maka di percobaan sebelumnya saya sebenarnya sudah bisa menampilkan flagnya.
Saya akan mencobanya sekali lagi, tetapi kali ini eksekusi program dilakukan pada instance yang diberikan di deskripsi challenge. Kali ini saya akan mencoba memasukkan string AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApico
sebagai input data, dan mengecek status heap.
Sekarang variabel safe_var
berhasil ditimpa dengan string "pico." Dan saya hanya perlu memilih opsi 4. Print Flag
untuk memenangkan permainan dan mendapatkan flagnya.
Berikut adalah solver untuk challenge ini:
Hasil running solver:
Jika kalian ingin mengetahui variasi lain dari buffer overflow dan cara eksploitasinya, kalian bisa membaca writeup ini.