DawgCTF 2021의 Two Truths and a Fib 문제다. "fibber를 잡을 수 있겠나?"라고 적혀 있다.
문제 이름을 직역한다면 2개의 진실과 한 fib(피보나치 수를 의미한다)다.
주어진 서버로 접속하면 위 사진과 같은 문구들이 출력된다.
해석해보면 3개의 정수가 주어지는데, 이 수들 중 피보나치 수를 찾아서 입력하는 것이다.
예제로 12, 8, 4가 주어졌는데, 실전에 주어지는 수들을 보면 길이가 장난 아니다.... 게다가 시간 제한까지 있어서 확실한건 손으로는 절대 못풀것 같다.
따라서 pwntools를 이용해서 자동화해 피보나치를 구별하고 입력을 준다면 flag를 얻을 수 있을 것이다.(취약점을 이용한 exploit이 아닌 이상..)
자동화 과정은 다음과 같다.
1. [<num1>, <num2>, <num3>]를 recvline 함수로 읽어와 ', '를 기준으로 parsing 후 각각 피보나치인지를 검사한다.
2. 피보나치 수가 맞다면 해당 수를 입력으로 주고 아니라면 다음 수를 검사한다.
3. flag가 감지될 때까지 위 과정을 반복한다.
from pwn import *
import math # sqrt 함수를 사용하기 위해 math import
def is_square(x):
s = int(math.sqrt(x))
return s*s == x
def is_fibonacci(n): # 주어진 수가 피보나치인지 검사
return is_square(5*n*n + 4) or is_square(5*n*n - 4)
r = remote('umbccd.io', 6000) # server
while True: # flag를 얻을 때까지 반복
try:
r.recvuntil('[') # [가 출력될 때까지 대기
except: # 만약 더 이상 [가 출력되지 않는다면 피보나치 구별 문제가 끝났다고 인식
print(r.recvline())
print(r.recvline())
print(r.recvline())
# flag를 읽어온 후 출력
break
tmp = r.recvline() # 주어진 수들을 읽어옴
tmp = tmp[:len(tmp)-2] # 맨 끝의 ']\n' 제거
num = tmp.split(b', ') # ', '를 기준으로 split
for i in num: # 주어진 수들이 피보나치 수인지 검사
if(is_fibonacci(int(i))):
r.sendline(i) # 피보나치라면 해당 수를 입력
break
r.interactive()
위처럼 자동화 코드를 작성했다.
'CTF' 카테고리의 다른 글
[Pwn2WinCTF 2021] Pwn - Baby write-only password manager(not solved) (0) | 2021.05.30 |
---|---|
[DawgCTF 2021] Pwn - Bofit (0) | 2021.05.08 |
[DawgCTF 2021] Misc - DawgCTF Discord (0) | 2021.05.08 |
TamuCTF 2021 후기 (0) | 2021.04.25 |
TamuCTF 2021 - TicTacToe (0) | 2021.04.25 |