morse = list(input().split())
decode_morse = []
for m in morse:
one_word = []
for i in range(0, len(m), 2):
tmp = int(m[i] + m[i+1], 16)
tmp = chr(tmp)
one_word.append(tmp)
decode_morse.append(one_word)
for m in decode_morse:
for w in m:
print(w, end="")
print()
일단 저 스페이드 문자는 실제로 유니코드 값으로 0x2660이다. 그리고 아래 식들을 보면, 한 줄당 하나의 알파벳의 값을 구할 수 있음을 알 수 있다. 그리고 Flag는 해당 알파벳들을 순서대로 나열하고 아스키 코드값으로 바꾸면 된다는 것을 명시해 놓았다.
그래서 차례대로 알파벳을 계산해 보면(아래 파이썬 코드로 계산시켰다)
i = 1
cnt = 0
alphabets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
while cnt < 7:
if i + 0x25eb == 0x2660:
alphabets[0] = i
cnt += 1
if 0x2674 - i == 0x2660:
alphabets[1] = i
cnt += 1
if 0x26d1 - i == 0x2660:
alphabets[2] = i
cnt += 1
if (i * 0x72) - 0xf10 == 0x2660:
alphabets[3] = i
cnt += 1
if 0x200 * (i >> 1) + 0x1460 == 0x2660:
if not alphabets[5]:
alphabets[5] = i
cnt += 1
if 0x75 * (i << 4) - 0x34720 == 0x2660:
alphabets[6] = i
cnt += 1
if (i + 3) ^ 0x2635 == 0x2660:
alphabets[8] = i
cnt += 1
i += 1
i = 1
while cnt < 10:
if 0x25 * (i - alphabets[1]) + 0x195e == 0x2660:
alphabets[4] = i
cnt += 1
if alphabets[2] + i + 0x258e == 0x2660:
alphabets[7] = i
cnt += 1
if (i ^ alphabets[0]) + 0x2644 == 0x2660:
alphabets[9] = i
cnt += 1
i += 1
for a in alphabets:
print(chr(a), end=" | ")
print(a)
실행결과 :
u | 117
| 20
q | 113
x | 120
n | 110
| 18
x | 120
a | 97
R | 82
i | 105
? 이상한 점을 못찾겠다. 다시 문제를 읽고 생각해 보았다. find the flag in this document...라고 했는데... 내용에 이상한게 있나?? ... 쭉 보다가 이상하게 오타감지 밑줄이 있는 부분을 봤다. ? 뭐지 저기 하고 글씨 색깔을 바꿔보니... !!! 뭐가 있다. 크기를 키워보자. 프롬프트에 뭐 명령어를 친거같은데.. 일단 주소가 있으니 주소로 가보자. !!!!! 보아하니 base64로 인코딩 된 문자열인 거 같다. 바로 디코딩 해보자. 딱 봐도 flag인 부분이 있다. DUCTF{chatgpt_I_n33d_2_3scap3}