Untuk tulisan kali ini binary yang dipakai berasal dari pwnable.kr dan binary lain, dapat didownload di github kami,
32bit
Pada bof.c, terdapat fungsi yang vulnerable terhadap buffer overflow, yaitu gets. Input (key) akan dibandingkan dengan nilai 0xcafebabe, jika benar, maka akan menjalankan /bin/sh. Goalnya adalah memanipulasi nilai key menjadi '0xcafebabe' dengan memanfaatkan buffer overflow.#include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; }
Pada bof.c, terdapat fungsi yang vulnerable terhadap buffer overflow, yaitu gets. Input (key) akan dibandingkan dengan nilai 0xcafebabe, jika benar, maka akan menjalankan /bin/sh.
Mencari Posisi 0xdeadbeef pada stack
Analyze (aaa) kemudian list function yang ada pada bof (afl).
Lanjut dengan, dissassembly main function (pdf@main).
Terlihat, pada fungsi main, terdapat fungsi lain yang dipanggil, yaitu sym.func. Pada source yang disertakan fungsi func disertakan juga nilai key = 0xdeadbeef. Untuk menentukan breakpoint yang tepat, dissassembly sym.func (pdf@sym.func).
Pasang breakpoint pada alamat 0x565cd654 (db 0x565cd654). Posisi ini ideal karena pada alamat ini instruksi cmp dijalankan.
Lanjutkan debugger menuju breakpoint yang telah dipasang (dc).
Pada posisi ini, cek isi top stack (pxw @esp) akan terlihat jelas posisi buffer dan ledak dari 0xdeadbeef yang akan timpa oleh nilai 0xcafebabe.
Dapat dilihat, bahwa input yang kita berikan tampil dekat dengan 0xdeadbeef, silahkan discroll lagi keatas untuk melihat source code dari bof.c. Besar dari buffer adalah 32, sementara masih tersisa beberapa byte lagi untuk sampai ke 0xdeadbeef.
Maka payload yang dibuat sebesar 32 + 20 + 0xcafebabe.
Scripting
Sebenarnya penyelesaian dengan one liner python bisa saja dilakukan, contohnya seperti ini.Tetapi, kali ini akan ada tambahan ngode dengan menggunakan pwntools.
64bit
Untuk kasus yang kedua ini sedikit berbeda dengan yang pertama, exploitasi dilakukan dengan menimpa return address memanfaatkan buffer yang tidak diproteksi.Ada beberapa fungsi selain fungsi main, yaitu fungsi simulasi dan nono. Setelah ditelusuri, ternyata fungsi simulasi tidak dipanggil, baik di fungsi main maupun nono.
Fungsi simulasi ternyata dapat mencetak flag.txt menggunakan system().Fungsi ini dapat dimanfaatkan untuk mengalihkan return address untuk mencetak flagnya.
Breakpoint dipasang pada alamat 0x004005c4 (db 0x004005c4) untuk mengamati stack setelah fungsi read.
Untuk mencapai return address, terdapat beberapa byte setelah buffer, termasuk rbp yang disimpan. Perhitungannya 17*8 = 136, untuk payload yang dibuat kira-kira menjadi 136+8 byte(address fungsi simulasi).
Sementara solusi yang melalui network dapat dibuat lagi menggunakan pwntools, aktifkan socat untuk simulasi menggunakan jaringan localhost.
root@xd:~/Downloads# socat tcp-listen:8000,reuseaddr,fork exec:./remote
Isi remote.py
from pwn import * r = remote('127.0.0.1',8000) simulasiaddr = p64(0x00400596) payload = 'A'*136 print simulasiaddr print r.recv() r.sendline(payload+simulasiaddr) print r.recv()
Sekian artikel sederhana ini kami buat, memang masih banyak kekurangan yang harus diperbaiki, kritik dan saran silahkan disampaikan di kolom komentar.
No comments:
Post a Comment