본문 바로가기
Misc

[DIMI CTF] dimi-contract

by L3m0n S0ju 2021. 8. 5.


def payBack():

    global dimicoin

    global debt

    if debt == 0:

        send("You no have debt!")

        return

 

    send("How much you pay back?")

    send(":> ", end='')

 

    try:

        payback = int(read())

    except ValueError:

        send("Plz input int")

        return

    if payback > debt or payback > dimicoin:

        send("Too much :<")

        return

 

    debt -= payback

    dimicoin -= payback

 

def getDebt():

    global dimicoin

    global debt

   

    send("How much you loan?")

    send(":> ", end='')

    try:

        loan = int(read())

    except ValueError:

        send("Plz input int")

        return

    if loan > 10:

        send("Too much :<")

        return

 

    debt += loan

    dimicoin += loan

 

def checkCoin():

    global dimicoin

    if dimicoin > 1000000:

        send("GoodJob!!!")

        send('-'*50)

        send(os.environ['flag'])

        send('-'*50)

        sys.exit(1)


위 코드는 문제의 핵심 함수만 가져왔습니다. nc 192.168.169.132 6713 와 같이 서버 ip의 6713 포트에 nc를 이용하여 접근하면 2가지 메뉴가 출력됩니다. 1번은 돈을 갚는 메뉴이고 2번은 돈을 빌리는 메뉴입니다. 돈을 빌리는 2번 메뉴의 경우 loan이 10보다 크면 동작하지 않습니다. 돈을 갚은 1번 메뉴는 입력한 숫자만큼 보유한 돈에서 뺄셈을 하는데 문제점은 부호에 대한 제약이 없다는 점입니다.


따라서 위와 같이 돈을 5만큼 빌리고 -1000000만큼 돈을 갚으면 dimicoin - payback을 계산하면 6.545 + 1000000 = 1000006.545가 되므로 백만달러를 넘게됩니다. 함수 checkCoin에서 백만달러 이상을 보유하고 있으면 플래그를 출력하므로 플래그가 출력됩니다.


 

플래그

 

'Misc' 카테고리의 다른 글

[Square CTF] Stegasaurus  (0) 2021.08.18
[Square CTF] 🍎🍌🍍🤔😱😭  (0) 2021.08.13
[DIMI CTF] keychecker  (0) 2021.08.05
[DIMI CTF] CTFind  (0) 2021.08.05
[Dreamhack] broken-png  (0) 2021.03.30

댓글