문제서버에 접속하여 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 |
댓글