Sechack

HSCTF 8 - not-really-math 풀이 본문

CTF

HSCTF 8 - not-really-math 풀이

Sechack 2021. 6. 19. 14:24
반응형

CTF에 알고리즘 카테고리가 있고 문제도 7개씩이나 있다... 해킹대횐데...ㅠㅠ 일단 나는 알고리즘을 못하는 사람이므로 안풀려고 했지만 첫번째 문제는 비빌만 해보여서 도전해봤는데 생각보다 쉬웠다.

 

 

 

 

일단 nc접속정보랑 PDF파일이 주어진다. 주어진 PDF파일을 열어보면 이렇다. 대충 a는 +로 치환하고 m은 *로 치환해서 +가 우선순위 더 높게 괄호로 묶어서 계산한 결과를 mod 2^31-1 해서 보내라는 말이다. 샘플을 보면 더 확실히 와닫는다. 일단 나의 주 아이디어는 주는 문자열에서 a는 +로 m은 *로 치환하고 +일때는 괄호 잘 처리해서 최종적으로는 식을 만든다음에 eval함수로 가져가서 계산결과를 얻고 그것을 보내는것이다.

 

 

 

일단 처음에는 문제 제대로 안읽고 1자리 숫자만 있는줄알고 인덱스가 짝수면 숫자로 처리하고 인덱스가 홀수면 *나 +로 처리했다. 하지만 숫자의 범위는 5≤n≤10000, 1≤v≤10000 이러했다. 따라서 나는 구현한 코드를 싹다 지우고 숫자를 하나하나 읽어오다가 m이나 a를 만나면 치환해주는 방식으로 바꿨다.

 

 

 

그리고 또한번 삽질한게 문제 꼼꼼히 안읽고 mod 2^31-1안하고 계산결과 그냥 보내니까 3번정도 보낸다음에 틀린 값이랜다. 식 출력해봐도 맞게 나오고 컴퓨터가 계산을 틀릴리는 없고... 문제 꼼꼼히 안읽어서 삽질했다.

 

 

from pwn import *

r = remote("not-really-math.hsc.tf", 1337)

r.recvline()

result = ""
number = ""
toggle = 0
count = 1

while(1):
    ex = r.recvline().strip()
    if b"flag" in ex:
        print(ex)
        break
    for i in range(0, len(ex)):
        if chr(ex[i]) == "a":
            if toggle == 0:
                result += "("
                result += number
                result += "+"
                number = ""
                toggle = 1
            else:
                result += number
                result += "+"
                number = ""
        elif chr(ex[i]) == "m":
            if toggle == 1:
                result += number
                result += ")"
                result += "*"
                number = ""
                toggle = 0
            else:
                result += number
                result += "*"
                number = ""
        else:
            number += chr(ex[i])
            if i == len(ex)-1:
                result += number
                number = ""
                if toggle == 1:
                    result += ")"
                    toggle = 0
                    
    result = eval(result)
    result = result % (2**32 -1)
    r.sendlineafter(": ", str(result))
    result = ""
    number = ""
    toggle = 0
    print(count)
    count += 1

r.interactive()

 

 

아무튼 최종 페이로드이다. 문자열 받아서 파싱해서 식으로 바꿔주는건 그다지 어렵진 않았다. mod 2^31-1때문에 삽질좀 했다. 코드 실행해보면

 

 

 

flag가 나왔다.

 

 

flag{yknow_wh4t_3ls3_is_n0t_real1y_math?_c00l_m4th_games.com}

 

 

(대회 중에 작성한 write up으로 대회가 끝날때까지 보호를 걸어놓았습니다.)

반응형

'CTF' 카테고리의 다른 글

redpwnCTF 2021 - simultaneity  (0) 2021.07.11
HSCTF 8 - House of Sice 풀이  (0) 2021.06.20
HSCTF 8 - message-board 풀이  (0) 2021.06.19
dCTF 2021 - This one is really basic 풀이  (0) 2021.05.17
dCTF 2021 - Julius' ancient script 풀이  (0) 2021.05.17
Comments