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 |
댓글