🧨 PICOCTF SECTION 5 β€” Binary Exploitation

Environment: Linux / GDB / C Compiler Filosofi: Paksa program melakukan hal yang tidak seharusnya melalui memori. Target: Binary Executables (.elf), vuln.c, & Memory Stack.

Golden Rule

Jika kamu bisa mengontrol input melebihi kapasitas buffer, kamu bisa mengontrol alur program.


FASE 1 β€” Konsep Buffer Overflow (Bof)

1.1 Analogi Gelas & Meja

Bayangkan gelas (buffer) 100ml yang dipaksa diisi 200ml air. Tumpahannya akan membasahi meja dan mencoret dokumen penting di sekitarnya.

  • Buffer: Tempat penyimpanan sementara di RAM.
  • Overflow: Input yang lebih panjang dari kapasitas buffer menimpa data lain (seperti Return Address).

1.2 Kerentanan Klasik: gets() & strcpy()

Kedua fungsi ini di bahasa C sangat berbahaya karena tidak mengecek panjang input.

char buf2[16];
strcpy(buf2, input); // JIKA input > 16 byte -> OVERFLOW!

FASE 2 β€” Anatomi Serangan Stack

Saat sebuah fungsi dipanggil, memori disusun sebagai berikut:

  1. Buffer (Local Vars): Misal buf[16].
  2. Saved EBP/FP: Penanda posisi frame.
  3. Return Address: Alamat instruksi yang harus dijalankan setelah fungsi selesai.

Mekanisme Exploit: Kirimkan β€œtumpahan” input (misal 28 karakter β€˜A’) untuk menimpa Return Address.

  • 16 karakter pertama mengisi buf.
  • Karakter sisanya menimpa Return Address dengan 0x41414141 (β€˜AAAA’).
  • Program akan bingung (Segmentation Fault) karena alamat tersebut tidak valid.

FASE 3 β€” Memicu Flag (The Exploit)

Pada tantangan beginner, seringkali terdapat Signal Handler yang otomatis mencetak flag jika terjadi crash.

3.1 Identifikasi di vuln.c

void sigsegv_handler(int sig) {
  printf("%s\n", flag); // Cetak flag saat crash
}

3.2 Langkah Eksekusi

# 1. Buat flag dummy (jika debugging lokal)
echo "picoCTF{test_flag_lokal}" > flag.txt
 
# 2. Kirim input panjang (32 karakter 'A') ke program
python3 -c "print('A' * 32)" | ./vuln

Hasil

Program akan kena SIGSEGV, memicu sigsegv_handler, dan mencetak isi flag.txt.


Quick Reference β€” Cheat Sheet

# ═══ EXPLOIT ONE-LINER ═══
python3 -c "print('A' * 32)" | ./vuln  # Kirim 32 karakter A
./vuln <<< $(python3 -c "print('A' * 64)") # Alternatif heredoc
 
# ═══ DEBUGGING ═══
cat vuln.c                             # Baca source code
ls -l vuln                             # Cek permission biner

Anti-Pattern β€” Jangan Lakukan Ini

❌ Salahβœ… Benar
Input karakter satu-satuGunakan Python one-liner untuk presisi
Lupa membuat flag.txt saat debugBuat file dummy agar program tidak error f == NULL
Abaikan jumlah buffer di kodeSelalu cek ukuran char buffer[X] di source code

πŸ”— Lihat Juga


PicoCTF Modul 3 | BinExp Β· Buffer Overflow Β· Stack Β· C