본문 바로가기
Misc

[DIMI CTF] dimi-math

by L3m0n S0ju 2021. 8. 19.

 

 

 

 


문제서버에 접속하여 300개의 문제를 모두 맞추면 플래그를 얻을 수 있다고 한다. 문제는 sympy 라이브러리를 사용하여 풀겠습니다.

 

 

 

 

 



from sympy import Symbol, solve # SymPy모듈 불러오기
from pwn import *
def main():

    r=remote("192.168.169.132",8231)
   

    x=Symbol('x') # x 미지수 생성
    equation = ""
    rData = ""

    for i in range(400): # 300번 반복이지만 여유를 줘서 400번 반복

        rData=r.recv(1024).decode() # 문자열 읽어오기
        print(rData) # 읽어온 문자열 출력
        if ("No. " in rData): 
            rData = "".join(rData.split(" ")[2:-4]) # 식을 분해하여 필요한 값들만 저장
            rData = rData.replace("x", "*x") # 앞에 계수가 1이 아니라고 가정
            equation = rData.replace("^", "**")
            print("[Parsed][ " + equation + " ]") # 정렬된 식 출력 ex) 14*x**3-2408*x**2+136738*x-2565640
            ansArr = solve(equation) # 계산
            lenArr = len(ansArr) # 해 개수
            rst = ""

            if (lenArr == 1): # 3중근일때
                rst = repr(ansArr[0]) + ", " + repr(ansArr[0]) + ", " + repr(ansArr[0]) # 정답 문자열 생성
                r.sendline(rst.encode()) # 정답 전송 -> sendline은 뒤에 개행문자도 같이 보낸다.
                print("[Sended] " + rst)

            elif (lenArr == 2): # 중근일때
                prifix = int(equation.split("*x**3")[0]) # 3차 계수
                emt1 = ansArr[0]
                emt2 = ansArr[1]
                eCase1 = prifix*(x -emt1)**2 * (x -emt2) # 1번째 해가 중근인경우
                eCase2 = prifix*(x -emt2)**2 * (x -emt1) # 2번째 해가 중근인경우

                if (eCase1.equals(equation)): # 1번째 해가 중근인 경우
                    rst = repr(emt1) + ", " + repr(emt1) + ", " + repr(emt2)
                    r.sendline(rst.encode())
                    print("[Sended] " + rst)

                elif(eCase2.equals(equation)): # 2번째 해가 중근인경우
                    rst = repr(emt1) + ", " + repr(emt2) + ", " + repr(emt2) 
                    r.sendline(rst.encode())
                    print("[Sended] " + rst)

            elif (lenArr == 3): # 해가 3개일때
                rst = repr(ansArr[0]) + ", " + repr(ansArr[1]) + ", " + repr(ansArr[2])
                r.sendline(rst.encode())
                print("[Sended] " + rst)

            if (i==304): # i가 300일때 문제도 300번째 일 것 같지만 실제로는 296번째 문제이므로 4를 더한 304일때 300번 문제가 끝난 시점이다.
                r.interactive()


if __name__ == "__main__":
    main()

 

 

 

 

 


플래그

'Misc' 카테고리의 다른 글

[HackCTF] Baseball Price  (0) 2021.09.10
[DIMI CTF] reader  (0) 2021.08.22
[Square CTF] Stegasaurus  (0) 2021.08.18
[Square CTF] 🍎🍌🍍🤔😱😭  (0) 2021.08.13
[DIMI CTF] keychecker  (0) 2021.08.05

댓글