Harekaze CTF - Fight

문제 파일 (problem.py)

problem.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import random
import base64
import key

def xor(msg, key):
return bytes([ch1^ch2 for ch1, ch2 in zip(msg, key)])

def gcd(x, y):
while y != 0:
r = x % y
x = y
y = r
return x

def gen_seed(n):
seed = 0
for k in range(1,n):
if gcd(k,n)==1:
seed += 1
return seed

s = 1
for p in b"Enjoy_HarekazeCTF!!":
s *= p
seed = gen_seed(s)
random.seed(str(seed).rstrip("0"))

flag = key.FLAG
key = bytes([random.randint(0,255) for _ in flag])

enc = xor(flag, key)
print(base64.b64encode(enc).decode('utf-8')) #7XDZk9F4ZI5WpcFOfej3Dbau3yc1kxUgqmRCPMkzgyYFGjsRJF9aMaLHyDU=

gen_seed함수는 오일러 파이 함수의 기능을 구현해놓은 듯 싶다.

그래서 일단 s를 출력한 뒤, φ(s)의 값을 Wolfram alpha에서 구해오기로 했다.

그럼 이제 이 seed를 가지고 역연산을 해주면 된다.

solve.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import random
import base64

def xor(msg, key):
return bytes([ch1 ^ ch2 for ch1, ch2 in zip(msg, key)])

seed = 765753154007029226621575888896000000

enc = base64.b64decode('7XDZk9F4ZI5WpcFOfej3Dbau3yc1kxUgqmRCPMkzgyYFGjsRJF9aMaLHyDU=')
random.seed(str(seed).rstrip("0"))

key = bytes([random.randint(0,255) for _ in enc])

print(xor(enc, key)) # HarekazeCTF{3ul3rrrrrrrrr_t0000000t1nt!!!!!}
Share