[๐ŸŒฑ ์ƒˆ์‹น] ์ด๋ฆ„์€ base64, ์ •์ฒด๋Š” base32 โ€” DreamHack likeb64 ํ’€์ด

2026-07-13ยท1๋ถ„ ์ฝ๊ธฐยท

[๐ŸŒฑ ์ƒˆ์‹น] ์ด๋ฆ„์€ base64, ์ •์ฒด๋Š” base32 โ€” DreamHack likeb64 ํ’€์ด

target.txt ์•ˆ์— base64์ฒ˜๋Ÿผ ์ƒ๊ธด ๋ฌธ์ž์—ด ํ•˜๋‚˜๋งŒ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ '=' ํŒจ๋”ฉ์ด 3๊ฐœ๊ณ , ๋ฐ์ดํ„ฐ ๊ธธ์ด๊ฐ€ 4์˜ ๋ฐฐ์ˆ˜์—์„œ ํ•˜๋‚˜ ์–ด๊ธ‹๋‚˜๋ฉฐ, ์ˆซ์ž์™€ +/ ๊ธฐํ˜ธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค. base64 ๊ทœ์น™์œผ๋กœ๋Š” ๋‚˜์˜ฌ ์ˆ˜ ์—†๋Š” ์ถœ๋ ฅ์ด๋‹ค. ๋ฌธ์ œ ์„ค๋ช…์ด ํ˜๋ฆฐ 32๊ธ€์ž ์•ŒํŒŒ๋ฒณ์„ ๋‹จ์„œ๋กœ ์ด๊ฒƒ์ด ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ base32(์ˆซ์ž 2-7 ์ž๋ฆฌ๋ฅผ a-f๋กœ ๋ฐ”๊พผ ๊ฒƒ)์ž„์„ ๋ฐํžˆ๊ณ , ์•ŒํŒŒ๋ฒณ๋งŒ ๋˜๋Œ๋ ค ๋ณตํ˜ธํ•œ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” likeb64 ๋ถ„๋ฅ˜: Crypto ๋‚œ์ด๋„: ๐ŸŒฑ ์ƒˆ์‹น FLAG: DH{a9a8a8fc724c76b1916bfe64e63b8d024a94c05cc196a60e473ddfba855c90f2}

"๋“œ๋ฆผ์ด๊ฐ€ base64๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์ž์‹ ๋งŒ์˜ ์•”ํ˜ธ๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”." ๋ฌธ์ œ ์„ค๋ช… ํ•œ ์ค„๊ณผ target.txt ์•ˆ์˜ ๋ฌธ์ž์—ด ํ•˜๋‚˜๊ฐ€ ์ „๋ถ€๋‹ค. ์ด๋ฆ„์ด likeb64๋ผ ๋‹น์—ฐํžˆ base64๋กœ ํ’€๋ฆฌ๊ฒ ๊ฑฐ๋‹ˆ ํ•˜๊ณ  ์†์„ ๋Œ€๋ฉด, ํŒŒ์ด์ฌ์ด Invalid base64-encoded string์„ ๋ฑ‰์œผ๋ฉฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐœ๋ชฉ์„ ์žก๋Š”๋‹ค. ์ด๋ฆ„๊ฐ’์— ์†์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด์˜ ์ƒ๊น€์ƒˆ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด ์ •์ฒด๊ฐ€ ๋“œ๋Ÿฌ๋‚œ๋‹ค.


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…likeb64
๋‚œ์ด๋„๐ŸŒฑ ์ƒˆ์‹น
๋ถ„๋ฅ˜Crypto
์ œ๊ณต ํŒŒ์ผtarget.txt (์•”ํ˜ธ๋ฌธ ๋ฌธ์ž์—ด 1๊ฐœ)
๋ชฉํ‘œ์•”ํ˜ธ๋ฌธ ๋ณตํ˜ธ โ†’ ํ”Œ๋ž˜๊ทธ
ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ base32 โ€” ํ‘œ์ค€์˜ ์ˆซ์ž 2-7 ์ž๋ฆฌ๋ฅผ a-f๋กœ ์น˜ํ™˜

์ด๋ฆ„์€ likeb64์ง€๋งŒ, ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด base64๊ฐ€ ์•„๋‹ˆ๋ผ base32๋‹ค. ๊ทธ๊ฒƒ๋„ ์•ŒํŒŒ๋ฒณ์˜ ๋งˆ์ง€๋ง‰ 6์นธ๋งŒ ์‚ด์ง ๋ฐ”๊ฟ”์น˜๊ธฐํ•œ ๊ฒƒ์ด๋ผ, ๊ทธ ์‚ฌ์‹ค๋งŒ ์•Œ์•„์ฑ„๋ฉด ํ•œ ์ค„๋กœ ๋ณตํ˜ธ๋œ๋‹ค. ์ •์ž‘ ๋ฌธ์ œ๋Š” "์ด๊ฒŒ base32๋‹ค"๋ผ๋Š” ๊ฑธ ๋ˆˆ์น˜์ฑ„๋Š” ๊ด€์ฐฐ์˜ ๊ณผ์ •์— ์žˆ๋‹ค.



๋ฐฐ๊ฒฝ โ€” base64 ์™€ base32 ๋Š” ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€

๋‘˜ ๋‹ค ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์•„์Šคํ‚ค ํ…์ŠคํŠธ๋กœ ์˜ฎ๊ธฐ๋Š” ์ธ์ฝ”๋”ฉ์ด์ง€๋งŒ, ํ•œ ๊ธ€์ž์— ๋ช‡ ๋น„ํŠธ๋ฅผ ๋‹ด๋А๋ƒ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

  • base64: 6๋น„ํŠธ์”ฉ ๋Š๋Š”๋‹ค. ์•ŒํŒŒ๋ฒณ์€ 64์นธ(A-Z a-z 0-9 + /). ์›๋ณธ 3๋ฐ”์ดํŠธ(24๋น„ํŠธ)๊ฐ€ ์ •ํ™•ํžˆ 4๊ธ€์ž(24๋น„ํŠธ)๋กœ ๋–จ์–ด์ ธ์„œ, ์ถœ๋ ฅ์€ 4๊ธ€์ž ๋‹จ์œ„๋กœ ๋ฌถ์ธ๋‹ค. 24๋น„ํŠธ์— ์•ˆ ๋งž๋Š” ๊ผฌ๋ฆฌ๋Š” = ํ•˜๋‚˜๋‚˜ ๋‘˜๋กœ ์ฑ„์šด๋‹ค. ๊ทธ๋ž˜์„œ base64์˜ = ํŒจ๋”ฉ์€ ์ตœ๋Œ€ 2๊ฐœ๋‹ค.
  • base32: 5๋น„ํŠธ์”ฉ ๋Š๋Š”๋‹ค. ์•ŒํŒŒ๋ฒณ์€ 32์นธ, RFC 4648 ํ‘œ์ค€์œผ๋กœ๋Š” ABCDEFGHIJKLMNOPQRSTUVWXYZ234567์ด๋‹ค. ์›๋ณธ 5๋ฐ”์ดํŠธ(40๋น„ํŠธ)๊ฐ€ 8๊ธ€์ž(40๋น„ํŠธ)๋กœ ๋–จ์–ด์ ธ์„œ, ์ถœ๋ ฅ์€ 8๊ธ€์ž ๋‹จ์œ„๋กœ ๋ฌถ์ธ๋‹ค. 40๋น„ํŠธ์— ์•ˆ ๋งž๋Š” ๊ผฌ๋ฆฌ๋Š” =๋กœ ์ฑ„์šฐ๋Š”๋ฐ, ์ด๋•Œ ํŒจ๋”ฉ ๊ฐœ์ˆ˜๋Š” ์›๋ณธ ๊ธธ์ด์— ๋”ฐ๋ผ 6ยท4ยท3ยท1๊ฐœ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ base32 ์•ŒํŒŒ๋ฒณ์„ ๋‹ค์‹œ ๋ณด์ž. ์•ž 26์นธ์€ A-Z, ๋’ค 6์นธ์€ **์ˆซ์ž 2-7**์ด๋‹ค. base64์™€ ๋‹ฌ๋ฆฌ ์†Œ๋ฌธ์ž๋„ ์—†๊ณ  +, /๋„ ์—†๋‹ค. ๋งŒ์•ฝ ๋ˆ„๊ตฐ๊ฐ€ ์ด ๋’ค์ชฝ ์ˆซ์ž 6์นธ์„ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋ฉด, ๊ฒ‰๋ณด๊ธฐ ๋ฌธ์ž์…‹๋งŒ ๋‹ฌ๋ผ์งˆ ๋ฟ ์ธ์ฝ”๋”ฉ ์›๋ฆฌ๋Š” ๊ทธ๋Œ€๋กœ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๋”ฑ ๊ทธ ์žฅ๋‚œ์„ ์ณค๋‹ค.


๐Ÿ”ฌ ์ •์ฐฐ โ€” ๋ฐ›์€ ๊ฑด ๋ฌธ์ž์—ด ํ•˜๋‚˜

์••์ถ•์„ ํ’€๋ฉด target.txt ํ•˜๋‚˜๋ฟ์ด๋‹ค. ๋จผ์ € ํŒŒ์ผ์„ ๋ˆˆ์œผ๋กœ ๋ณด๊ณ , ๊ธธ์ดยทํŒจ๋”ฉยท๊ผฌ๋ฆฌ ๋ฐ”์ดํŠธ๋ฅผ ์„ผ๋‹ค.

cat target.txt; echo
tail -c 12 target.txt | od -An -c          # ๊ผฌ๋ฆฌ ๋ฐ”์ดํŠธ (ํŒจ๋”ฉ ํ™•์ธ)
echo "chars: $(tr -d '\n' < target.txt | wc -c)  =(pad): $(tr -cd '=' < target.txt | wc -c)"
target.txt ์›๋ฌธ๊ณผ ๊ผฌ๋ฆฌ ๋ฐ”์ดํŠธ โ€” ์ „์ฒด 112์ž, ๋์ด G O J Q M Y Z H a = = = ๋กœ ๋“ฑํ˜ธ ํŒจ๋”ฉ 3๊ฐœ
target.txt ์›๋ฌธ๊ณผ ๊ผฌ๋ฆฌ ๋ฐ”์ดํŠธ โ€” ์ „์ฒด 112์ž, ๋์ด G O J Q M Y Z H a = = = ๋กœ ๋“ฑํ˜ธ ํŒจ๋”ฉ 3๊ฐœ

๋ฌธ์ž์—ด์€ 112์ž, ๋์€ ===๋กœ ํŒจ๋”ฉ์ด 3๊ฐœ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด๋ฏธ base64๊ฐ€ ์•„๋‹ˆ๋‹ค. base64์˜ =๋Š” ์•„๋ฌด๋ฆฌ ๋งŽ์•„์•ผ 2๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ข€ ๋” ์ •๋Ÿ‰์ ์œผ๋กœ ๋œฏ์–ด๋ณด๋ ค๊ณ  ์งง์€ ์ •์ฐฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•˜๋‚˜ ๋Œ๋ ธ๋‹ค.

# why_b32.py โ€” ์ •๋ง base64 ์ธ์ง€ ๊ฒ€์ฆ
import collections
ct = open("target.txt").read().strip()
data = ct.rstrip("=")
npad = len(ct) - len(data)
print(f"์ „์ฒด ๊ธธ์ด      : {len(ct)}")
print(f"ํŒจ๋”ฉ '=' ๊ฐœ์ˆ˜  : {npad}   (base64๋Š” ์ตœ๋Œ€ 2, 3์€ ๋ถˆ๊ฐ€ โ†’ base64 ์•„๋‹˜)")
print(f"๋ฐ์ดํ„ฐ ๊ธธ์ด    : {len(data)}   ({len(data)}%4={len(data)%4} โ†’ base64 ๊ทธ๋ฃน(4) ์•ˆ ๋งž์Œ)")
print(f"distinct ์‹ฌ๋ณผ  : {len(set(data))}๊ฐœ  {''.join(sorted(set(data)))}")
print(f"์ˆซ์ž/+// ์œ ๋ฌด  : {any(c.isdigit() for c in data)} / {any(c in '+/' for c in data)}")
print()
print("== base32 ๋กœ ๋ณด๋ฉด ๋”ฑ ๋งž๋Š”๋‹ค ==")
print(f"112 = 8 ร— 14 ๊ทธ๋ฃน (base32๋Š” 8๋ฌธ์ž ๊ทธ๋ฃน)")
print(f"๋ฐ์ดํ„ฐ {len(data)}์ž = 13ร—8 + 5 โ†’ 13ร—5 + 3 = 68 ๋ฐ”์ดํŠธ (ํ”Œ๋ž˜๊ทธ ๊ธธ์ด์™€ ์ผ์น˜)")
base64 ๋ถ€์ • 3๊ทผ๊ฑฐ์™€ base32 ์ •ํ•ฉ์„ฑ โ€” ํŒจ๋”ฉ3ยท๋ฐ์ดํ„ฐ109(109%4=1)ยท์ˆซ์ž์™€ +/ ์ „๋ฌด, 112๋Š” 8๊ธ€์ž ๊ทธ๋ฃน 14๊ฐœ์— ๋ฐ์ดํ„ฐ 109์ž๋Š” 68๋ฐ”์ดํŠธ๋กœ ๋”ฑ ๋–จ์–ด์ง
base64 ๋ถ€์ • 3๊ทผ๊ฑฐ์™€ base32 ์ •ํ•ฉ์„ฑ โ€” ํŒจ๋”ฉ3ยท๋ฐ์ดํ„ฐ109(109%4=1)ยท์ˆซ์ž์™€ +/ ์ „๋ฌด, 112๋Š” 8๊ธ€์ž ๊ทธ๋ฃน 14๊ฐœ์— ๋ฐ์ดํ„ฐ 109์ž๋Š” 68๋ฐ”์ดํŠธ๋กœ ๋”ฑ ๋–จ์–ด์ง

์ •๋ฆฌํ•˜๋ฉด ์„ธ ๊ฐ€์ง€๊ฐ€ ์ „๋ถ€ base64๋ฅผ ๋ถ€์ •ํ•œ๋‹ค.

  1. = ํŒจ๋”ฉ์ด 3๊ฐœ โ€” base64๋Š” ์ตœ๋Œ€ 2๊ฐœ.
  2. ๋ฐ์ดํ„ฐ๊ฐ€ 109์ž์ด๊ณ  109 % 4 == 1 โ€” base64๋Š” 4๊ธ€์ž ๊ทธ๋ฃน์ด๋ผ ๋ฐ์ดํ„ฐ ๊ธธ์ด๊ฐ€ 4๋กœ ๋‚˜๋ˆ ๋–จ์–ด์ง€๊ฑฐ๋‚˜ ๊ทธ๋ฃน ์•ˆ์—์„œ 1ยท2 ๋ชจ์ž๋ž€ ์ •๋„์—ฌ์•ผ ํ•œ๋‹ค. ํ•˜๋‚˜ ๋‚จ๋Š” ํ˜•ํƒœ(% 4 == 1)๋Š” base64๊ฐ€ ์• ์ดˆ์— ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ธธ์ด๋‹ค.
  3. ์ˆซ์ž๋„ +, /๋„ ์ „ํ˜€ ์—†๋‹ค โ€” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉํ–ˆ๋‹ค๋ฉด ์ˆซ์ž์™€ ๊ธฐํ˜ธ๊ฐ€ ๊ณจ๊ณ ๋ฃจ ์„ž์—ฌ ๋‚˜์˜จ๋‹ค. ๋ฌธ์ž์…‹์ด ๋Œ€๋ฌธ์ž A-Z์— ์†Œ๋ฌธ์ž a, b, c ์ •๋„๋งŒ ์žˆ๋Š” ๊ฑด ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

๋ฐ˜๋ฉด base32๋กœ ๋ณด๋ฉด ์ „๋ถ€ ๋งž์•„๋–จ์–ด์ง„๋‹ค. 112์ž๋Š” 8๊ธ€์ž ๊ทธ๋ฃน 14๊ฐœ, ํŒจ๋”ฉ 3๊ฐœ๋Š” base32์—์„œ ์œ ํšจํ•œ ๊ฐœ์ˆ˜, ๋ฐ์ดํ„ฐ 109์ž๋ฅผ 5๋น„ํŠธ์”ฉ ํ’€๋ฉด ์ •ํ™•ํžˆ 68๋ฐ”์ดํŠธ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  DH{ + 64์ž๋ฆฌ hex + } = 68์ž, ์ฆ‰ ํ”Œ๋ž˜๊ทธ ๋ณธ๋ฌธ์ด 64์ž๋ฆฌ hex(sha256์œผ๋กœ ์ถ”์ •)๋ผ๋Š” ๊ฒƒ๊นŒ์ง€ ๊ธธ์ด๊ฐ€ ๋งž๋Š”๋‹ค.

โ–ถ ์‚ฝ์งˆ: ์ด๋ฆ„๊ฐ’ ํ•˜๋А๋ผ base64๋กœ๋งŒ ์”จ๋ฆ„ํ•˜๊ณ , ์น˜ํ™˜์•”ํ˜ธ๋กœ ํฌ๋ž˜ํ‚นํ•˜๋ ค๋‹ค ํ—›๋ฐœ์งˆ

์ฒ˜์Œ์—” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ base64๋กœ ๋ฐ€์–ด๋ถ™์˜€๋‹ค. ํ‘œ์ค€ ๊ทธ๋Œ€๋กœ, = ๋–ผ๊ณ  ํŒจ๋”ฉ ๋‹ค์‹œ, swapcase ํ›„ ๋“ฑ ๋ณ€์ฃผ๋ฅผ ์ค˜๋ด๋„ ์ „๋ถ€ ๊ฐ™์€ ์˜ˆ์™ธ์—์„œ ๋ฉˆ์ถ˜๋‹ค.

# sapjil_b64.py
import base64
ct = open("target.txt").read().strip()
for label, s in [("ํ‘œ์ค€ ๊ทธ๋Œ€๋กœ", ct),
                 ("'=' ๋–ผ๊ณ  ํŒจ๋”ฉ ๋‹ค์‹œ", ct.rstrip('=') + '=' * (-len(ct.rstrip('=')) % 4)),
                 ("swapcase ํ›„", ct.rstrip('=').swapcase())]:
    try:
        print(label, base64.b64decode(s))
    except Exception as e:
        print(label, "์‹คํŒจ:", e)
coreutils/python base64 ์„ธ ๊ฐ€์ง€ ์‹œ๋„ ๋ชจ๋‘ ์‹คํŒจ โ€” number of data characters (109) cannot be 1 more than a multiple of 4
coreutils/python base64 ์„ธ ๊ฐ€์ง€ ์‹œ๋„ ๋ชจ๋‘ ์‹คํŒจ โ€” number of data characters (109) cannot be 1 more than a multiple of 4

number of data characters (109) cannot be 1 more than a multiple of 4. ํŒŒ์ด์ฌ์ด ๋Œ€๋†“๊ณ  "109๋Š” 4์˜ ๋ฐฐ์ˆ˜๋ณด๋‹ค 1 ๋งŽ์•„์„œ ์•ˆ ๋œ๋‹ค"๊ณ  ์•Œ๋ ค์ค€๋‹ค. ์ด ๋ฉ”์‹œ์ง€ ์ž์ฒด๊ฐ€ ํžŒํŠธ์˜€๋Š”๋ฐ, ์ฒ˜์Œ์—” ์•ŒํŒŒ๋ฒณ์ด ์ปค์Šคํ…€ base64๊ฒ ๊ฑฐ๋‹ˆ ํ•˜๊ณ  ์—‰๋šฑํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ƒœ๋‹ค.

๊ทธ๋‹ค์Œ ์‚ฝ์งˆ์€ "์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ base64๋ฅผ ์น˜ํ™˜์•”ํ˜ธ๋กœ ๋ณต์›ํ•˜์ž"์˜€๋‹ค. ์•Œ๋ ค์ง„ ํ‰๋ฌธ DH{์˜ ํ‘œ์ค€ base64๊ฐ€ REh7์ด๋‹ˆ, ์•”ํ˜ธ๋ฌธ ์•ž 4๊ธ€์ž์™€ ๋Œ€์‘์‹œ์ผœ Vigenรจre ํ‚ค(์ฃผ๊ธฐ 4)๋ฅผ ์ถ”์ •ํ•˜๊ฑฐ๋‚˜, 6๋น„ํŠธ ์น˜ํ™˜ ํ…Œ์ด๋ธ”์„ ์‹œ๋ฎฌ๋ ˆ์ดํ‹ฐ๋“œ ์–ด๋‹๋ง์œผ๋กœ ๋งž์ถฐ๋ณด๋ ค ํ–ˆ๋‹ค.

# vig.py โ€” DH{ ์˜ ํ‘œ์ค€ b64 "REh7" ๋ฅผ ์•ต์ปค๋กœ ์ฃผ๊ธฐ4 Vigenรจre ํ‚ค ์ถ”์ • (์‹คํŒจ)
STD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
data = open("target.txt").read().strip().rstrip("=")
key = [(STD.find(data[i]) - STD.find("REh7"[i])) % 64 for i in range(4)]
print("key(period4 guess):", key)   # ๋ณต์› ๊ฒฐ๊ณผ๊ฐ€ ์ „ํ˜€ printable ํ•˜์ง€ ์•Š์Œ

์ „๋ถ€ ํ—›์ˆ˜๊ณ ์˜€๋‹ค. ์• ์ดˆ์— base64(6๋น„ํŠธ)๊ฐ€ ์•„๋‹ˆ๋ผ base32(5๋น„ํŠธ)์˜€์œผ๋‹ˆ, 6๋น„ํŠธ ๋‹จ์œ„๋กœ ์•„๋ฌด๋ฆฌ ์น˜ํ™˜์„ ๋งž์ถฐ๋ด์•ผ ๋น„ํŠธ ๊ฒฝ๊ณ„๋ถ€ํ„ฐ ์–ด๊ธ‹๋‚œ๋‹ค. ๋ฌธ์ œ ์„ค๋ช…์ด ํ˜๋ฆฐ ํžŒํŠธ๋ฅผ ์ œ๋Œ€๋กœ ์ฝ๊ณ  ๋‚˜์„œ์•ผ ๋ฐฉํ–ฅ์„ ํ‹€์—ˆ๋‹ค.


๊ฒฐ์ •์  ๋‹จ์„œ โ€” ์„ค๋ช…์ด ํ˜๋ฆฐ 32๊ธ€์ž ์•ŒํŒŒ๋ฒณ

๋ฌธ์ œ ์„ค๋ช… ๋งจ ์•„๋ž˜์— ํžŒํŠธ๊ฐ€ ํ•˜๋‚˜ ๋ถ™์–ด ์žˆ๋‹ค.

hint: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef

์„ธ์–ด ๋ณด๋ฉด ์ •ํ™•ํžˆ 32๊ธ€์ž๋‹ค. A๋ถ€ํ„ฐ Z๊นŒ์ง€ 26๊ธ€์ž์— a b c d e f 6๊ธ€์ž๋ฅผ ๋ถ™์ธ ๊ฒƒ. 32์นธ์งœ๋ฆฌ ์•ŒํŒŒ๋ฒณ = base32. ์ด๋ฆ„์€ likeb64("base64 ๊ฐ™๋‹ค")์ง€๋งŒ, ์‹ค์ œ ์ •์ฒด๋Š” ์•ŒํŒŒ๋ฒณ๋งŒ ๊ฐˆ์•„ ๋ผ์šด base32์˜€๋˜ ๊ฒƒ์ด๋‹ค. ํ‘œ์ค€ base32์™€ ๋‚˜๋ž€ํžˆ ๋†“์œผ๋ฉด ์ฐจ์ด๊ฐ€ ํ•œ๋ˆˆ์— ๋ณด์ธ๋‹ค.

ํ‘œ์ค€ base32 : ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
likeb64     : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef
                                        ^^^^^^  ๋’ค 6์นธ๋งŒ 234567 โ†’ abcdef

์•ž 26์นธ A-Z๋Š” ๊ทธ๋Œ€๋กœ๊ณ , ๊ฐ’ 26~31์— ํ•ด๋‹นํ•˜๋Š” ๋งˆ์ง€๋ง‰ 6์นธ๋งŒ ํ‘œ์ค€์˜ 2 3 4 5 6 7์„ a b c d e f๋กœ ๋ฐ”๊ฟจ๋‹ค. ์•”ํ˜ธ๋ฌธ์— ์ˆซ์ž๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋˜ ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ์ˆซ์ž๊ฐ€ ๋‚˜์˜ฌ ์ž๋ฆฌ๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์œ„์žฅํ•ด "base64์ฒ˜๋Ÿผ" ๋ณด์ด๊ฒŒ ๋งŒ๋“  ๊ฒƒ.

likeb64 ์ „์ฒด ๋…ผ๋ฆฌ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” base64๊ฐ€ ์•„๋‹Œ 3๊ทผ๊ฑฐ, base32 ์ •ํ•ฉ์„ฑ, ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ(234567โ†’abcdef) ์น˜ํ™˜, ๊ทธ๋ฆฌ๊ณ  ๋ณตํ˜ธ ๊ฒฐ๊ณผ
likeb64 ์ „์ฒด ๋…ผ๋ฆฌ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” base64๊ฐ€ ์•„๋‹Œ 3๊ทผ๊ฑฐ, base32 ์ •ํ•ฉ์„ฑ, ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ(234567โ†’abcdef) ์น˜ํ™˜, ๊ทธ๋ฆฌ๊ณ  ๋ณตํ˜ธ ๊ฒฐ๊ณผ

base32 5๋น„ํŠธ ํŒจํ‚น์œผ๋กœ ์•ต์ปค ๊ฒ€์ฆ

๊ฐ€์„ค์„ ์„ธ์› ์œผ๋ฉด ์•Œ๋ ค์ง„ ํ‰๋ฌธ์œผ๋กœ ๋ชป์„ ๋ฐ•๋Š”๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ํ•ญ์ƒ DH{๋กœ ์‹œ์ž‘ํ•˜๋‹ˆ, ์ด 3๋ฐ”์ดํŠธ๋ฅผ ํ‘œ์ค€ base32๋กœ ์ธ์ฝ”๋”ฉํ•ด ์•”ํ˜ธ๋ฌธ์˜ ์‹œ์ž‘๊ณผ ๋งž์ถฐ๋ณด๋ฉด ๋œ๋‹ค. base32๊ฐ€ 5๋น„ํŠธ์”ฉ ์–ด๋–ป๊ฒŒ ๋Š๋Š”์ง€ ์†์œผ๋กœ ๋”ฐ๋ผ๊ฐ€ ๋ดค๋‹ค.

# bits.py โ€” 'DH{' 3๋ฐ”์ดํŠธ(24๋น„ํŠธ)๋ฅผ 5๋น„ํŠธ์”ฉ ๋Š์–ด base32 ์ธ๋ฑ์Šค๋กœ
CUSTOM = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
pt = b"DH{"
bits = "".join(f"{b:08b}" for b in pt)              # 24๋น„ํŠธ
groups = [bits[i:i+5] for i in range(0, 25, 5)]     # 5๋น„ํŠธ 5์นธ(๋งˆ์ง€๋ง‰์€ 1๋น„ํŠธ+0ํŒจ๋”ฉ)
groups[-1] = groups[-1].ljust(5, "0")
idx = [int(g, 2) for g in groups]
print("๋น„ํŠธ(24)  :", bits)
print("5๋น„ํŠธ ๊ทธ๋ฃน :", " ".join(groups))
print("โ†’ ์ธ๋ฑ์Šค   :", idx)                            # [8, 17, 4, 7, 22]
print("โ†’ likeb64  :", "".join(CUSTOM[i] for i in idx))   # IREHW
ํ‰๋ฌธ DH ์„ธ ๊ธ€์ž๋ฅผ 24๋น„ํŠธ๋กœ ์ด์–ด 5๋น„ํŠธ 5๊ทธ๋ฃน์œผ๋กœ ๋ถ„ํ•ดํ•ด ์ธ๋ฑ์Šค 8,17,4,7,22 ๋ฅผ ์–ป๊ณ  IREHW ๋กœ ์ธ์ฝ”๋”ฉ, ์•”ํ˜ธ๋ฌธ ์‹œ์ž‘ IREHWYJZ ์™€ ์•ž 5๊ธ€์ž ์ผ์น˜
ํ‰๋ฌธ DH ์„ธ ๊ธ€์ž๋ฅผ 24๋น„ํŠธ๋กœ ์ด์–ด 5๋น„ํŠธ 5๊ทธ๋ฃน์œผ๋กœ ๋ถ„ํ•ดํ•ด ์ธ๋ฑ์Šค 8,17,4,7,22 ๋ฅผ ์–ป๊ณ  IREHW ๋กœ ์ธ์ฝ”๋”ฉ, ์•”ํ˜ธ๋ฌธ ์‹œ์ž‘ IREHWYJZ ์™€ ์•ž 5๊ธ€์ž ์ผ์น˜

DH{(0x44 0x48 0x7b)๋ฅผ 24๋น„ํŠธ๋กœ ์ด์–ด๋ถ™์—ฌ 5๋น„ํŠธ์”ฉ ๋Š์œผ๋ฉด ์ธ๋ฑ์Šค [8, 17, 4, 7, 22], ์•ŒํŒŒ๋ฒณ์— ๋Œ€์ž…ํ•˜๋ฉด IREHW๊ฐ€ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•”ํ˜ธ๋ฌธ์€ IREHWYJZโ€ฆ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์•ž 5๊ธ€์ž๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. ์ด ์•ŒํŒŒ๋ฒณ์œผ๋กœ base32๋ฅผ ๋Œ๋ฆฌ๋ฉด ๋œ๋‹ค๋Š” ํ™•์ฆ์ด๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋„ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ–ˆ๋‹ค.

# anchor.py
import base64
ct = open("target.txt").read().strip()
print("์•”ํ˜ธ๋ฌธ ์‹œ์ž‘ 5์ž         :", ct[:5])                       # IREHW
print("base32('DH{') ํ‘œ์ค€์ถœ๋ ฅ  :", base64.b32encode(b'DH{').decode())  # IREHW===
base32 ๋กœ DH ์ ‘๋‘์‚ฌ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋ฉด IREHW ๋กœ ์‹œ์ž‘ํ•ด ์•”ํ˜ธ๋ฌธ๊ณผ ์ผ์น˜, ํ‘œ์ค€ ์•ŒํŒŒ๋ฒณ(๋ 234567)๊ณผ likeb64 ์•ŒํŒŒ๋ฒณ(๋ abcdef) ๋น„๊ต๋กœ ์ˆซ์ž๊ฐ€ ์—†๋˜ ์ด์œ  ํ™•์ธ
base32 ๋กœ DH ์ ‘๋‘์‚ฌ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋ฉด IREHW ๋กœ ์‹œ์ž‘ํ•ด ์•”ํ˜ธ๋ฌธ๊ณผ ์ผ์น˜, ํ‘œ์ค€ ์•ŒํŒŒ๋ฒณ(๋ 234567)๊ณผ likeb64 ์•ŒํŒŒ๋ฒณ(๋ abcdef) ๋น„๊ต๋กœ ์ˆซ์ž๊ฐ€ ์—†๋˜ ์ด์œ  ํ™•์ธ

๋ณตํ˜ธ โ€” ์•ŒํŒŒ๋ฒณ๋งŒ ๋˜๋Œ๋ฆฌ๋ฉด ๋

์ด์ œ ํ•  ์ผ์€ ๋‹จ์ˆœํ•˜๋‹ค. ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ โ€ฆabcdef๋ฅผ ํ‘œ์ค€ base32 ์•ŒํŒŒ๋ฒณ โ€ฆ234567๋กœ ๋ฌธ์ž ์น˜ํ™˜ํ•œ ๋’ค, ๊ทธ๋ƒฅ ํ‘œ์ค€ base32 ๋””์ฝ”๋”์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. ํŒŒ์ด์ฌ base64.b32decode๊ฐ€ ํ‘œ์ค€ ์•ŒํŒŒ๋ฒณ์„ ๊ฐ€์ •ํ•˜๋ฏ€๋กœ, str.translate๋กœ 6๊ธ€์ž๋งŒ ๋˜๋Œ๋ ค ์ฃผ๋ฉด ๊ทธ๋Œ€๋กœ ๋จน๋Š”๋‹ค.

# solve.py
import base64
raw = open("target.txt").read().strip()
CUSTOM = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"     # likeb64 ์•ŒํŒŒ๋ฒณ
STDB32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"     # ํ‘œ์ค€ base32 ์•ŒํŒŒ๋ฒณ
flag = base64.b32decode(raw.translate(str.maketrans(CUSTOM, STDB32)))
print("[+] FLAG:", flag.decode())
solve.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” ์ปค์Šคํ…€ base32 ๋ฅผ ํ‘œ์ค€์œผ๋กœ ๋˜๋Œ๋ ค b32decode, DH ํ”Œ๋ž˜๊ทธ a9a8a8fcโ€ฆ855c90f2 ์ถœ๋ ฅ
solve.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” ์ปค์Šคํ…€ base32 ๋ฅผ ํ‘œ์ค€์œผ๋กœ ๋˜๋Œ๋ ค b32decode, DH ํ”Œ๋ž˜๊ทธ a9a8a8fcโ€ฆ855c90f2 ์ถœ๋ ฅ
[+] FLAG: DH{a9a8a8fc724c76b1916bfe64e63b8d024a94c05cc196a60e473ddfba855c90f2}

ํ”Œ๋ž˜๊ทธ ๋ณธ๋ฌธ์€ 64์ž๋ฆฌ hex, DH{}๊นŒ์ง€ ํ•ฉ์ณ 68์ž๋‹ค. ์•ž์„œ ์ •์ฐฐ์—์„œ ๊ณ„์‚ฐํ•œ "๋ฐ์ดํ„ฐ 109์ž โ†’ 68๋ฐ”์ดํŠธ"์™€ ์ •ํ™•ํžˆ ๋งž์•„๋–จ์–ด์ง„๋‹ค.



๋‹ค๋ฅธ ๋„๊ตฌ๋กœ ๊ต์ฐจ๊ฒ€์ฆ

์น˜ํ™˜ ๊ทœ์น™์ด ์›Œ๋‚™ ๋‹จ์ˆœํ•ด์„œ ํŒŒ์ด์ฌ ์—†์ด๋„ ํ™•์ธ๋œ๋‹ค. ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ๊ณผ ํ‘œ์ค€์˜ ์ฐจ์ด๋Š” ์†Œ๋ฌธ์ž a-f๊ฐ€ 2-7์„ ๋Œ€์‹ ํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ด๋‹ˆ, tr๋กœ ๊ทธ 6๊ธ€์ž๋งŒ ๋˜๋Œ๋ฆฐ ๋‹ค์Œ coreutils์˜ base32 -d์— ํ˜๋ ค๋ณด๋‚ด๋ฉด ๋œ๋‹ค. ๋Œ€๋ฌธ์ž A-Z๋Š” ๋‘ ์•ŒํŒŒ๋ฒณ์—์„œ ๋™์ผํ•ด ๊ฑด๋“œ๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค.

cat target.txt | tr 'a-f' '234567' | base32 -d; echo
coreutils base32 CLI ๊ต์ฐจ๊ฒ€์ฆ โ€” tr ๋กœ a-f ๋ฅผ 234567 ๋กœ ๋˜๋Œ๋ฆฐ ๋’ค base32 -d ๋กœ ๋””์ฝ”๋“œํ•ด ๋™์ผํ•œ DH ํ”Œ๋ž˜๊ทธ ์ถœ๋ ฅ
coreutils base32 CLI ๊ต์ฐจ๊ฒ€์ฆ โ€” tr ๋กœ a-f ๋ฅผ 234567 ๋กœ ๋˜๋Œ๋ฆฐ ๋’ค base32 -d ๋กœ ๋””์ฝ”๋“œํ•ด ๋™์ผํ•œ DH ํ”Œ๋ž˜๊ทธ ์ถœ๋ ฅ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฆ๊ฒจ ์“ฐ๋Š” CyberChef๋กœ๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค. From Base32 ์—ฐ์‚ฐ์€ ์•ŒํŒŒ๋ฒณ์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ, Alphabet ์นธ์— ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef=๋ฅผ ๊ทธ๋Œ€๋กœ ๋„ฃ๊ณ  ์•”ํ˜ธ๋ฌธ์„ Input์— ๋ถ™์ด๋ฉด Output์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋œฌ๋‹ค. ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ์„ ์•Œ ๋•Œ ๋ณ„๋„ ์Šคํฌ๋ฆฝํŠธ ์—†์ด ๊ฒ€์ฆํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

CyberChef From Base32 ์—ฐ์‚ฐ์— ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ์„ ์ง€์ •ํ•ด ๋””์ฝ”๋“œ โ€” Input 112์ž, Output 68์ž DH ํ”Œ๋ž˜๊ทธ
CyberChef From Base32 ์—ฐ์‚ฐ์— ์ปค์Šคํ…€ ์•ŒํŒŒ๋ฒณ์„ ์ง€์ •ํ•ด ๋””์ฝ”๋“œ โ€” Input 112์ž, Output 68์ž DH ํ”Œ๋ž˜๊ทธ

๋ฐฉ์–ด ๊ด€์  โ€” ์ธ์ฝ”๋”ฉ์€ ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹ˆ๋‹ค

์ด ๋ฌธ์ œ๋Š” ์งง์ง€๋งŒ ์š”์ ์ด ๋ถ„๋ช…ํ•˜๋‹ค.

  • ์ธ์ฝ”๋”ฉ(base32/base64)์€ ๊ธฐ๋ฐ€์„ฑ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ์•ŒํŒŒ๋ฒณ๋งŒ ์•Œ๋ฉด ๋ˆ„๊ตฌ๋“  ๋˜๋Œ๋ฆฐ๋‹ค. ์—ฌ๊ธฐ์„œ "์ž์‹ ๋งŒ์˜ ์•ŒํŒŒ๋ฒณ"์œผ๋กœ ์‚ด์ง ๋น„ํ‹€์–ด๋„, ์•ŒํŒŒ๋ฒณ 32~64๊ธ€์ž๋ฅผ ๋ฌธ์ œ ์„ค๋ช…์— ํ˜๋ฆฌ๊ฑฐ๋‚˜ ์•Œ๋ ค์ง„ ํ‰๋ฌธ ๋ช‡ ๊ธ€์ž๋กœ ์—ญ์‚ฐ๋˜๋Š” ์ˆœ๊ฐ„ ๋ฌด์šฉ์ง€๋ฌผ์ด๋‹ค. ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ base64/base32๋กœ "๊ฐ€๋ ค" ๋‘๋Š” ๊ฑด ๋ณด์•ˆ์ด ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ๋ˆˆ์†์ž„์ด๋‹ค.
  • ๊ฒ‰๋ณด๊ธฐ์— ์†์ง€ ๋ง๊ณ  ๊ตฌ์กฐ๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฆ„(likeb64)๊ณผ ๊ฒ‰๋ชจ์–‘(= ํŒจ๋”ฉ, ๋Œ€์†Œ๋ฌธ์ž)๋งŒ ๋ณด๋ฉด base64๋กœ ์˜ค์ธํ•˜๊ธฐ ์‰ฝ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจ๋”ฉ ๊ฐœ์ˆ˜, ๋ฐ์ดํ„ฐ ๊ธธ์ด์˜ ๋‚˜๋จธ์ง€, ๋“ฑ์žฅ ๋ฌธ์ž์…‹(์ˆซ์žยท๊ธฐํ˜ธ ์œ ๋ฌด) ๊ฐ™์€ ์ •๋Ÿ‰์  ์ง€ํ‘œ๊ฐ€ ์ธ์ฝ”๋”ฉ์˜ ์ข…๋ฅ˜๋ฅผ ์ •ํ™•ํžˆ ๊ฐ€๋ ค๋‚ธ๋‹ค. base64๋Š” = ์ตœ๋Œ€ 2๊ฐœยท4๊ธ€์ž ๊ทธ๋ฃน, base32๋Š” = 6/4/3/1๊ฐœยท8๊ธ€์ž ๊ทธ๋ฃน์ด๋ผ๋Š” ๊ทœ์น™๋งŒ ๊ธฐ์–ตํ•ด๋„ ์˜ค์ธ์„ ํ”ผํ•œ๋‹ค.
  • ์•Œ๋ ค์ง„ ํ‰๋ฌธ์€ ๊ฐ•๋ ฅํ•œ ๊ฒ€์ฆ ์ˆ˜๋‹จ์ด๋‹ค. ํ”Œ๋ž˜๊ทธ ์ ‘๋‘์‚ฌ DH{์ฒ˜๋Ÿผ ํ™•์ •๋œ ์กฐ๊ฐ์ด ์žˆ์œผ๋ฉด, ๊ฐ€์„ค๋กœ ์„ธ์šด ์•ŒํŒŒ๋ฒณ/์ธ์ฝ”๋”ฉ์ด ๋งž๋Š”์ง€ ๋‹จ ๋ช‡ ๊ธ€์ž๋กœ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

likeb64๋ผ๋Š” ์ด๋ฆ„์€ ๋‚š์‹œ๊ณ , ์ •์ฒด๋Š” ์•ŒํŒŒ๋ฒณ 6์นธ๋งŒ ๋ฐ”๊พผ base32์˜€๋‹ค. ์ด๋ฆ„๊ฐ’์— ๋Œ๋ ค๊ฐ€์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด์˜ ์ƒ๊น€์ƒˆ๋ฅผ ์„ธ์–ด ๋ณธ ๊ฒƒ์ด ํ’€์ด์˜ ์ „๋ถ€์˜€๋‹ค.

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ ๋ธŒ๋ก ์ฆˆ 4] ๊ฒน๊ฒน์ด ์ธ์ฝ”๋”ฉ๋œ base64 ๋ฒ—๊ธฐ๊ธฐ โ€” DreamHack Base64 10 Times ํ’€์ด
blog

[๐Ÿฅ‰ ๋ธŒ๋ก ์ฆˆ 4] ๊ฒน๊ฒน์ด ์ธ์ฝ”๋”ฉ๋œ base64 ๋ฒ—๊ธฐ๊ธฐ โ€” DreamHack Base64 10 Times ํ’€์ด

๋ฌธ์ œ ์„ค๋ช…์— ๊ธด base64 ๋ฌธ์ž์—ด ํ•˜๋‚˜๋งŒ ์ฃผ์–ด์ง„๋‹ค. ๋””์ฝ”๋“œํ•˜๋ฉด ๋˜ base64, ๋‹ค์‹œ ๋””์ฝ”๋“œํ•ด๋„ ๋˜ base64 โ€” ์—ฌ๋Ÿฌ ๊ฒน์œผ๋กœ ์ธ์ฝ”๋”ฉ๋ผ ์žˆ๋‹ค. ๋งค ์ธต ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ์ „ํžˆ ์ธ์‡„ ๊ฐ€๋Šฅํ•œ base64๋ผ, ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณด์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ๋””์ฝ”๋“œํ•˜๋ฉด ๋œ๋‹ค. ์—ดํ•œ ๋ฒˆ ๋ฒ—๊ธฐ๋‹ˆ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚˜์™”๋‹ค.
#dreamhack#ctf#crypto+3
2026-07-13#dreamhack +5
[๐Ÿฅ‰ Bronze 3] 38๊ฒน์œผ๋กœ ๊ฐ์‹ผ Base64 ๋ฒ—๊ธฐ๊ธฐ โ€” DreamHack What is This??? ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] 38๊ฒน์œผ๋กœ ๊ฐ์‹ผ Base64 ๋ฒ—๊ธฐ๊ธฐ โ€” DreamHack What is This??? ํ’€์ด

ํ•˜๋‚˜์˜ ๊ธด ๋ฌธ์ž์—ด๋งŒ ์ฃผ๊ณ  ๋ฌด์—‡์ด๋ƒ๊ณ  ๋ฌป๋Š” crypto ๋ฌธ์ œ. Base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ Base64๋กœ, ๋˜ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Base64๋กœ... 38๋ฒˆ ๊ฒน์ณ ๊ฐ์‹ผ ๊ฒƒ์ด๋ผ, ๋””์ฝ”๋“œ ๊ฒฐ๊ณผ๊ฐ€ ๋” ์ด์ƒ Base64๊ฐ€ ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ๋ฒ—๊ธฐ๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์›๋ณธ ํŒŒ์ผ์€ 100๋งŒ ๋ฐ”์ดํŠธ๊ฐ€ ๋„˜๋Š”๋ฐ, ๊ฒน๋งˆ๋‹ค 25%์”ฉ ์ค„์–ด๋“ค์–ด ์ตœ์ข… flag๋Š” 15๋ฐ”์ดํŠธ๋กœ ๋๋‚œ๋‹ค.
#dreamhack#ctf#crypto+3
2026-07-14#dreamhack +5
[๐Ÿฅ‰ Bronze 2] ์„ธ ๊ฒน์œผ๋กœ ํฌ์žฅํ•œ ๊ทค ์ƒ์ž ๋ฒ—๊ธฐ๊ธฐ โ€” DreamHack ๊ฐ๊ทค ํฌ์žฅํ•˜๊ธฐ ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] ์„ธ ๊ฒน์œผ๋กœ ํฌ์žฅํ•œ ๊ทค ์ƒ์ž ๋ฒ—๊ธฐ๊ธฐ โ€” DreamHack ๊ฐ๊ทค ํฌ์žฅํ•˜๊ธฐ ํ’€์ด

ํ”Œ๋ž˜๊ทธ๋ฅผ wrap(์•„ํ•€ ๊ณฑ์…ˆ)ยทbox(์œ„์น˜๋ณ„ XOR)ยทtruck(๋’ค์ง‘์€ ํ…Œ์ด๋ธ” base64) ์„ธ ๋ณ€ํ™˜์œผ๋กœ ํฌ์žฅํ•œ ๋ฌธ์ œ. ๋ฌธ์ œ ์„ค๋ช… ์ž์ฒด๊ฐ€ 4์ปท ๋งŒํ™”๋กœ "์ฆ™ ์งœ๊ณ  ์–‘๋… ์น˜๊ธฐ โ†’ ๋งˆ๊ตฌ์žก์ด๋กœ ์„ž๊ณ  ํ…Œ์ดํ”„๋กœ ๊ฐ๊ธฐ โ†’ ๋’ค์ฃฝ๋ฐ•์ฃฝ ๊ธ€์ž ํŠธ๋Ÿญ์— ์‹ฃ๊ธฐ โ†’ ๋ฐฐ์†ก ์™„๋ฃŒ"๋ฅผ ๊ทธ๋ ค ๋†“์•˜๋‹ค. ์„ธ ๋ณ€ํ™˜์ด ๋ชจ๋‘ ๊ฐ€์—ญ์ด๋ผ, ์ ์šฉ๋œ ์—ญ์ˆœ์œผ๋กœ base64๋ฅผ ํ’€๊ณ  XOR๋ฅผ ๋˜๋Œ๋ฆฌ๊ณ  ์•„ํ•€์„ ์—ญ์‚ฐํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚˜์˜จ๋‹ค.
#dreamhack#ctf#crypto+4
2026-07-14#dreamhack +4