๋ฌธ์ : DreamHack โ What is This??? ๋ถ๋ฅ: Crypto ๋์ด๋: ๐ฅ Bronze 3 FLAG:
DH{hellobase64}
ํ์ผ ํ๋์ Vm0wd2QyUXlVWGxW...๋ก ์์ํ๋ ๊ธด ๋ฌธ์์ด๋ง ๋ค์ด ์๋ค. ๋ฌธ์ ์ค๋ช
๋ "์ด๊ฒ ๋ญ๋
ธ!!"๊ฐ ์ ๋ถ๋ค. ์ ๋ชฉ์ฒ๋ผ "์ด๊ฒ ๋ญ๋"๋ฅผ ๋ฌป๋ ๋ฌธ์ ์ธ๋ฐ, ์ ์ฒด๋ ์ฌ๋ฌ ๋ฒ ๊ฒน์ณ ์ธ์ฝ๋ฉํ Base64๋ค โ ๊ทธ๊ฒ๋ ํ๋ ๋ฒ์ด ์๋๋ผ 38๋ฒ.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | What is This??? |
| ๋์ด๋ | ๐ฅ Bronze 3 |
| ๋ถ๋ฅ | Crypto |
| ์ ๊ณต ํ์ผ | prob.txt (1,067,980๋ฐ์ดํธ, ์ค๋ฐ๊ฟ ์๋ ํ ์ค) |
| ํต์ฌ ๊ธฐ๋ฒ | Base64 ์ค์ฒฉ ์ธ์ฝ๋ฉ ๋ฐ๋ณต ๋์ฝ๋ |
prob.txt๋ง ์์ผ๋ฉด ์คํ๋ผ์ธ์์ ๋ฐ๋ก ํ๋ฆฐ๋ค.
๐งฉ ๋ฐฐ๊ฒฝ โ Base64 ๋ ์ ๊ฒน์ณ๋ ํฐ๊ฐ ๋๋
Base64๋ ์์์ ๋ฐ์ดํธ๋ฅผ 64๊ฐ ์ธ์ ๊ฐ๋ฅ ๋ฌธ์(A-Z a-z 0-9 + /)๋ก ์ฎ๊ธฐ๋ ์ธ์ฝ๋ฉ์ด๋ค. 3๋ฐ์ดํธ(24๋นํธ)๋ฅผ 4๊ธ์(6๋นํธ์ฉ)๋ก ๋ฐ๊พธ๊ณ , ๋ถ์กฑํ๋ฉด =๋ก ํจ๋ฉํ๋ค. ์ํธ๊ฐ ์๋๋ผ ๊ทธ์ ํํ ๋ฐฉ์์ด๋ผ ํค ์์ด ๋๊ตฌ๋ ๋๋๋ฆด ์ ์๋ค.
์ค์ฒฉ ์ธ์ฝ๋ฉ์ ํ์ ์ ๊ฒฐ๊ณผ๋ฌผ์์ ๋ฐ๋ก ๋๋ฌ๋๋ค. ์ด๋ค ๋ฌธ์์ด์ Base64๋ก ์ธ์ฝ๋ฉํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ ์ญ์ A-Z a-z 0-9 + /์ =๋ง์ผ๋ก ์ด๋ค์ง๋ค. ๊ทธ๋์ "๋์ฝ๋ํ๋๋ ๋ Base64์ฒ๋ผ ์๊ธด ๋ฌธ์์ด"์ด ๋์ค๋ฉด, ํ ๊ฒน ๋ ๊ฐ์ธ์ ธ ์๋ค๋ ์ ํธ๋ค. Vm0wd... ๊ฐ์ ๋ฌธ์์ด์ด ์ด ๊ฒฝ์ฐ๋ค.
๋ ํ๋ ์์๋๋ฉด ์ข์ ์ฑ์ง์ Base64๊ฐ ์๋ณธ๋ณด๋ค ํญ์ ์ปค์ง๋ค๋ ๊ฒ์ด๋ค. 3๋ฐ์ดํธ๋ฅผ 4๊ธ์๋ก ๋ฐ๊พธ๋ ์ธ์ฝ๋ฉํ ๋๋ง๋ค ํฌ๊ธฐ๊ฐ 4/3๋ฐฐ(์ฝ 33%) ๋์ด๋๋ค. ๋ค์ง์ด ๋งํ๋ฉด, ๋์ฝ๋ํ ๋๋ง๋ค ํฌ๊ธฐ๊ฐ 3/4(์ฝ 25%)๋ก ์ค์ด๋ ๋ค. ์ด ๋ฌธ์ ์ prob.txt๊ฐ 100๋ง ๋ฐ์ดํธ๊ฐ ๋๋ ์ด์ ๋, 15๋ฐ์ดํธ์ง๋ฆฌ ํ๋๊ทธ๋ฅผ 38๋ฒ ์ธ์ฝ๋ฉํด์ ๋ถํ๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฌ ์ ์ฐฐ โ ํ์ผ ํํ์ ๋ฌธ์์ ํ์ธ
๋จผ์ ํ์ผ์ด ์ ๋ง ์์ํ Base64 ๋ฉ์ด๋ฆฌ์ธ์ง ํ์ธํ๋ค.
file prob.txt
python3 -c "
import re
s = open('prob.txt').read().strip()
print('base64 ๋ฌธ์์
๋ง ์ฌ์ฉ:', bool(re.fullmatch(r'[A-Za-z0-9+/=]+', s)))
print('๊ธธ์ด:', len(s), ' 4์ ๋ฐฐ์:', len(s) % 4 == 0)
"
file์ "with very long lines (65536)"๋ผ๊ณ ์๋ ค์ค๋ค โ 100๋ง ๋ฐ์ดํธ๊ฐ ๋๋๋ฐ ์ค๋ฐ๊ฟ์ด ํ๋๋ ์๋ค๋ ๋ป์ด๋ค. ์ ๊ท์ ๊ฒ์ฌ๋ก๋ A-Za-z0-9+/= ๋ฐ์ ๋ฌธ์๊ฐ ํ๋๋ ์๊ณ , ๊ธธ์ด๋ Base64์ 4๋ฐ์ดํธ ๋จ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค. ์ธ ์กฐ๊ฑด(๋ฌธ์์
ยท์ค๋ฐ๊ฟ ์์ยท4์ ๋ฐฐ์ ๊ธธ์ด) ๋ค Base64๋ผ๋ ๊ฐ์ค๊ณผ ๋ง์๋จ์ด์ง๋ค.
ํ ๋ฒ๋ง ๋์ฝ๋ํด ๋ณธ๋ค.
import base64
s = open("prob.txt").read().strip()
print(base64.b64decode(s).decode()[:60])
# -> "Vm0wd2QyUXl..." ์ฌ์ ํ Base64ํ ๊ฒน ๋ฒ๊ฒจ๋ ๋ Base64๊ฐ ๋์จ๋ค. ํฌ๊ธฐ๊ฐ ์ผ๋ง๋ ์ค์ด๋๋์ง ์ฒ์ ๋ช ๋ผ์ด๋๋ง ์ฐ์ด๋ดค๋ค.
wc -c prob.txt
python3 -c "
import base64
s = open('prob.txt').read().strip()
for i in range(1, 6):
s = base64.b64decode(s).decode()
print(f'round {i:2d}: {len(s):7d} bytes')
"
800984, 600736, 450552... ๋งค ๋ผ์ด๋ ์ ํํ ์ด์ ๊ฐ์ 0.75๋ฐฐ๋ค. ๋ฐฐ๊ฒฝ์์ ๊ณ์ฐํ "๋์ฝ๋ํ ๋๋ง๋ค 3/4๋ก ์ค์ด๋ ๋ค"๋ ์์ธก์ด ์ค์ ๋ฐ์ดํฐ๋ก ๊ทธ๋๋ก ํ์ธ๋๋ค.
๐ฏ ํ์ด โ ๋ฒ๊ฒจ์ง ๋๊น์ง ๋ฒ๊ธด๋ค
์ด๊ฑธ ์์ผ๋ก ๋ฐ๋ณตํ๊ธด ์ง์น๋, "๋ ์ด์ Base64๊ฐ ์๋ ๋๊น์ง" ์๋์ผ๋ก ๋ฒ๊ธฐ๊ฒ ๋ง๋ ๋ค. ์ข
๋ฃ ์กฐ๊ฑด์ ๋์ฝ๋ ๊ฒฐ๊ณผ์ ํ๋๊ทธ ํ์(DH{)์ด ๋ณด์ด๋ ์๊ฐ์ด๋ค.
# solve.py
import base64
s = open("prob.txt").read().strip()
for i in range(1, 100):
s = base64.b64decode(s).decode()
if "DH{" in s:
print(f"[{i}ํ] FLAG: {s}"); break
๋ง์ง๋ง ๋ช ๋ผ์ด๋๋ง ๋ฐ๋ก ์ฐ์ด๋ณด๋ฉด ์ด๋ป๊ฒ ์๋ ดํ๋์ง ๋ ์ ๋ณด์ธ๋ค.
python3 -c "
import base64
s = open('prob.txt').read().strip()
for i in range(1, 39):
s = base64.b64decode(s).decode()
tag = f' -> {s}' if i >= 36 else ''
print(f'round {i:2d}: {len(s):4d} bytes{tag}')
" | tail -6
36๋ผ์ด๋๊น์ง๋ ์ฌ์ ํ Base64 ๋ฌธ์์ด(UkVoN2FHVnNiRz...)์ด๋ ๊ฒ, 38๋ผ์ด๋์์ ๋๋์ด ์ฌ๋์ด ์ฝ์ ์ ์๋ DH{hellobase64}๋ก ๋จ์ด์ง๋ค. ๊ฒน์ ๊ฐ์๊ฐ ๋ง์ ๋ฟ, ๊ฐ ๊ฒน์ ๋๊ฐ์ Base64๋ผ ๋ฒ๊ธฐ๋ ์ ์ฐจ๋ ์ฒ์๋ถํฐ ๋๊น์ง ๋๊ฐ๋ค.

FLAG: DH{hellobase64}
๐ ๊ฒฐ๋ก
์ธ์ฝ๋ฉ์ ๋ช ๊ฒน์ด์ด๋ ์ธ์ฝ๋ฉ์ด๋ค. Base64๋ฅผ ์๋ฌด๋ฆฌ ์ฌ๋ฌ ๋ฒ ๊ฒน์ณ๋ ๊ฐ ๊ฒน์ ํค ์์ด ๋๋๋ฆด ์ ์๋ ํํ ๋ณํ์ผ ๋ฟ์ด๋ค. ๊ฒน์ ์๊ฐ ๋ฐฉ์ด๊ฐ ๋์ง๋ ๋ชปํ๋ค. ์ ์ฒด ๋ชจ๋ฅผ ๋ฌธ์์ด์ด A-Z a-z 0-9 + / =๋ก๋ง ์ด๋ค์ ธ ์์ผ๋ฉด Base64๋ฅผ ๋จผ์ ์์ฌํ๊ณ , ๊ฒฐ๊ณผ๊ฐ ๋ ๊ทธ ๊ผด์ด๋ฉด ํ ๊ฒน ๋ ๋ฒ๊ธฐ๋ฉด ๋๋ค.
ํฌ๊ธฐ ๋ณํ๊ฐ ํํธ๊ฐ ๋ ๋๋ ์๋ค. ์ด๋ฒ ๋ฌธ์ ์ฒ๋ผ ์๋ณธ ํ์ผ์ด ์ ๋ํ ํฐ๋ฐ ๋ด์ฉ๋ฌผ์ ์งง์ ํ๋๊ทธ ํ๋๋ฟ์ด๋ผ๋ฉด, "์ธ์ฝ๋ฉ์ด ์ฌ๋ฌ ๊ฒน ์์์ ธ ๋ถํ์๋ค"๋ ๊ฐ์ค์ ์ธ์ธ ์ ์๋ค. Base64๋ ๊ฒน๋ง๋ค ์ ํํ 4/3๋ฐฐ ์ปค์ง๋ฏ๋ก, ์ญ์ผ๋ก ํ์ผ ํฌ๊ธฐ์ ์์๋๋ ์ต์ข
๊ฒฐ๊ณผ ํฌ๊ธฐ์ ๋น์จ์ ๋ณด๋ฉด ๋๋ต ๋ช ๊ฒน์ธ์ง๋ ๋ฏธ๋ฆฌ ๊ฐ๋ ํ ์ ์๋ค(์ด ๋ฌธ์ ๋ผ๋ฉด log(1067980/15) / log(4/3) โ 38).
์ข
๋ฃ ์กฐ๊ฑด์ ๋ฌธ์ ์ ํ์์์ ๊ฐ์ ธ์จ๋ค. ๋ช ๋ฒ ๋ฒ๊ฒจ์ผ ํ๋์ง ๋ฏธ๋ฆฌ ์
ํ์ ์์ด, ํ๋๊ทธ ํ์(DH{)์ด ๋ํ๋๋ ์๊ฐ์ ์ข
๋ฃ ์กฐ๊ฑด์ผ๋ก ์ผ์ผ๋ฉด ๋ฐ๋ณต ํ์๋ฅผ ๋ชฐ๋ผ๋ ์๋์ผ๋ก ๋ฉ์ถ๋ค. ํฌ๋งท์ด ๊ณ ์ ๋ ํ๋๊ทธ๋ ์ด๋ฐ ์๋ํ์ ๋ ์ข์ ์ ํธ๊ฐ ๋๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ