๋ฌธ์ : DreamHack โ Batch Checker ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ Bronze 2 FLAG:
DH{BA7cH_cAN_hiDe_u5iNg_text}
๋ฌธ์ ์ค๋ช
์ "๊ณผ์ฐ ํ๋๊ทธ๋ฅผ ํ์ธํ ์ ์์๊น์? ์คํ๋ง ํ๋ฉด ๋ฉ๋๋ค!"๋ผ๋ฉฐ ํ์ฐํ๊ฒ ์คํ์ ๊ถํ๋ค. ํ์ง๋ง ์ค์ ๋ก ์คํํด๋ด์ผ ์ป๋ ๊ฑด correct๋ wrong์ด๋ผ๋ ํ ๋ง๋๋ฟ, ํ๋๊ทธ ์์ฒด๋ ๋์ค์ง ์๋๋ค โ ๋ธ๋ฃจํธํฌ์ค๋ก ๋งํ๋ผ๋ ์๋ฆฌ์ ๊ฐ๊น๋ค. ์ด ๋ฐฐ์น ํ์ผ ํ๋๊ฐ ์ ๋ถ์ธ ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ์ธ๋ฐ, ์ด์ด ๋ณด๋ฉด ๋ฌด์์ ์ด๋ฆ์ ๊ธด ๋ณ์๋ค๊ณผ ์ ์ ์๋ %...% ๊ธฐํธ๊ฐ ๋นฝ๋นฝํ๋ค. ๋ฐฐ์น ํน์ ์ ๋ถ๋ถ ๋ฌธ์์ด ๋ฌธ๋ฒ์ผ๋ก ๋ช
๋ น์ ํ ๊ธ์์ฉ ํฉ์ด ๋์ ๋๋
ํ๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | Batch Checker |
| ๋์ด๋ | ๐ฅ Bronze 2 |
| ๋ถ๋ฅ | Reversing |
| ์ ๊ณต ํ์ผ | prob.bat (38์ค, ๋ณ์ 37๊ฐ, ์กฐ๋ฆฝ ๋ช
๋ น ํ ์ค 7,463์) |
| ํต์ฌ ๊ธฐ๋ฒ | %VAR:~offset,len% ๋ถ๋ถ ๋ฌธ์์ด ์นํ ํด์ |
๋ฐฐ์น๋ฅผ ์คํํ์ง ์๊ณ ๋, ์นํ ๊ท์น๋ง ํ๋ก๊ทธ๋จ์ผ๋ก ํ๋ฉด ์๋ ๋ช ๋ น์ด ๋ณต์๋๋ค.
๐งฉ ๋ฐฐ๊ฒฝ โ ๋ฐฐ์น์ ๋ถ๋ถ ๋ฌธ์์ด ๋ฌธ๋ฒ
์๋์ฐ ๋ฐฐ์น์๋ ๋ณ์์ ์ผ๋ถ๋ง ์๋ผ ์ฐ๋ ๋ฌธ๋ฒ์ด ์๋ค. %NAME:~offset,length%๋ ๋ณ์ NAME์ ๊ฐ์์ offset๋ถํฐ length๊ธ์๋ฅผ ๋ฝ๋๋ค. ์๋ฅผ ๋ค์ด SET "V=abcdef" ์ํ์์ %V:~2,1%๋ c ํ ๊ธ์๋ค.
์ด ๋ฌธ์ ๋ ๊ทธ ๋ฌธ๋ฒ์ ๋๋
ํ์ ์ด๋ค. ๋ฌด์๋ฏธํ ์ด๋ฆ์ ๊ธด ๋ณ์๋ฅผ ์์ญ ๊ฐ ์ ์ํด ๋๊ณ , ์คํํ ๋ช
๋ น์ ๊ทธ ๋ณ์๋ค์ ๋ถ๋ถ ๋ฌธ์์ด๋ก ํ ๊ธ์์ฉ ์ด์ด ๋ถ์ธ๋ค. ์ฌ๋ ๋์๋ ๋์์ฒ๋ผ ๋ณด์ด์ง๋ง, ๊ฐ %VAR:~n,1%๋ ์ ํด์ง ํ ๊ธ์๋ฅผ ๊ฐ๋ฆฌํฌ ๋ฟ์ด๋ค.
๐ฌ ์ ์ฐฐ โ ๋ฌด์์ ์กฐ๋ฆฝํ๋๊ฐ
prob.bat์ ํฌ๊ฒ ๋ ๋ถ๋ถ์ด๋ค. ์์ชฝ์ SET "์ด๋ฆ=๊ฐ" ํํ๋ก ๋ณ์ 37๊ฐ๋ฅผ ์ ์ํ๊ณ , ๋ค์ชฝ ํ ์ค์ด @%A:~53,1%%B:~26,1%...์ฒ๋ผ ์๋ง์ ๋ถ๋ถ ๋ฌธ์์ด์ ์ด์ด ๋ถ์ฌ ์ค์ ๋ช
๋ น์ ๋ง๋ ๋ค.
wc -l prob.bat
awk '{print length}' prob.bat | sort -rn | head -3
head -c 300 prob.bat
ํ์ผ ์ ์ฒด๋ 38์ค๋ฟ์ธ๋ฐ ๊ทธ์ค ์กฐ๋ฆฝ ๋ช ๋ น ํ ์ค์ด ๋ฌด๋ ค 7,463์๋ค. ๋ณ์ ์ด๋ฆยท๊ฐ๋ ์ ๋ถ 100์ ์ํ์ ๋ฌด์๋ฏธํ ์ํ๋ฒณ ๋์ด์ด๋ค. ์ด๋ ๊ฒ ์กฐ๋ฆฝ๋ ๋ช ๋ น์ด ์ ๋ ฅ์ ๊ฒ์ฌํ๋ ๋ก์ง์ด๋ฏ๋ก, ์นํ๋ง ํ๋ฉด ๊ฒ์ฌ ๋์(=ํ๋๊ทธ)์ด ๊ทธ๋๋ก ๋ณด์ธ๋ค.
์นํ ๋ฉ์ปค๋์ฆ์ด ์ ๋ง ๊ทธ๋ ๊ฒ ๋์ํ๋์ง ์์ผ๋ก ํ ๊ธ์๋ง ๋จผ์ ํ์ธํด๋ดค๋ค. ์กฐ๋ฆฝ ๋ช
๋ น์ ์ฒซ ๊ธ์๋ ๋ฆฌํฐ๋ด @์ด๊ณ , ๊ทธ๋ค์ ์ฒซ ๋ฒ์งธ %VAR:~53,1% ํจํด์ด ๋ฌด์์ ๊ฐ๋ฆฌํค๋์ง ๋ดค๋ค.
name, off = "๊ธด ๋ณ์๋ช
", 53
val = vars[name]
print(repr(val[off]))
100์์ง๋ฆฌ ๋ณ์์ 53๋ฒ์งธ ๋ฌธ์๊ฐ ์ ํํ 'e'๋ค. ๋ฆฌํฐ๋ด @ ๋ค์์ ์ด e๊ฐ ์ด์ด์ง๋ฉด @e..., ์ฆ ์ต์ข
๋ช
๋ น์ด @echo off๋ก ์์ํ๋ค๋ ๊ฒ๊ณผ ๋ง์๋จ์ด์ง๋ค. ๊ท์น์ ์ ๋๋ก ์ฝ์๋ค๋ ํ์ ์ด ์๋, ์ด์ ์ด ๊ณผ์ ์ ์ ์ฒด ๋ฌธ์์ด์ ์๋์ผ๋ก ๋ฐ๋ณตํ๋ฉด ๋๋ค.
๐ฏ ํ์ด โ ์นํ์ ํ๋ก๊ทธ๋จ์ผ๋ก ํด์
SET ์ ์๋ฅผ ๋์
๋๋ฆฌ๋ก ํ์ฑํ๊ณ , %NAME:~off,len% ํจํด์ ์ค์ ๋ถ๋ถ ๋ฌธ์์ด๋ก ๋ฐ๋ณต ์นํํ๋ค.
# solve.py
import re
lines = open("prob.bat", encoding="utf-8", errors="replace").read().splitlines()
vars = {}
for l in lines:
m = re.match(r'\s*SET\s+"([^=]+)=(.*)"\s*$', l, re.I)
if m: vars[m.group(1)] = m.group(2)
def resolve(line):
def sub(mm):
v = vars.get(mm.group(1), ""); off = int(mm.group(2)); ln = mm.group(3)
return v[off:] if ln == "" else v[off:off+int(ln)]
prev = None
while prev != line:
prev = line; line = re.sub(r'%([A-Za-z0-9_]+):~(-?\d+),?(\d*)%', sub, line)
return line
for l in lines:
if not l.strip().lower().startswith("set ") and l.count("%") > 4:
print("๋ณต์๋ ๊ฒ์ฌ:", resolve(l).strip())
๋ณต์๋ ๋ช ๋ น์ ์ด๋ ๋ค.
@echo off && if "%FLAG%"=="BA7cH_cAN_hiDe_u5iNg_text" (echo correct) else (echo wrong) && pause
์
๋ ฅ์ด BA7cH_cAN_hiDe_u5iNg_text์ ๊ฐ์์ง ๋น๊ตํ๋ค. ์ด ๊ฐ์ด ๊ณง ํ๋๊ทธ ๋ณธ๋ฌธ์ด๋ค. ๋ฐฐ์น๋ฅผ ์ค์ ๋ก ์คํํ๋ ๋์ , ๊ฐ์ ๋น๊ต๋ฅผ ํ์ด์ฌ์ผ๋ก ํ๋ด ๋ด ์ ๋ง correct๊ฐ ๋์ค๋์ง ํ์ธํ๋ค.
FLAG = "BA7cH_cAN_hiDe_u5iNg_text"
target = "BA7cH_cAN_hiDe_u5iNg_text"
print("correct" if FLAG == target else "wrong")
FLAG: DH{BA7cH_cAN_hiDe_u5iNg_text}
๐ ๊ฒฐ๋ก
๋๋
ํ๋ ์คํ ๋ก์ง์ ์ง์ฐ์ง ๋ชปํ๋ค. ๋ถ๋ถ ๋ฌธ์์ด๋ก ์๋ฌด๋ฆฌ ์๊ฒ ํฉ์ด ๋์๋, ๊ทธ ์กฐ๊ฐ๋ค์ ํฉ์น๋ฉด ์๋ ๋ช
๋ น์ด ๋์ด์ผ ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ค. ์กฐ๋ฆฝ ๊ท์น(%VAR:~n,1%)๋ง ํ๋ก๊ทธ๋จ์ผ๋ก ๋์ง์ผ๋ฉด ๋๋
ํ๋ ๊ทธ๋๋ก ํ๋ฆฐ๋ค. ๋ณ์ 37๊ฐ, 7,463์์ง๋ฆฌ ํ ์ค์ด๋ผ๋ ๊ท๋ชจ๊ฐ ์ํ์ ์ผ๋ก ๋ณด์ฌ๋, ์นํ ๊ท์น ์์ฒด๋ ์์ข
์ผ๊ด ๋๊ฐ์์ ์ ์ฐฐ ํ ๋ฒ์ด๋ฉด ์ ์ฒด๋ฅผ ์๋ํํ ์ ์๋ค.
"์คํ๋ง ํ๋ฉด ๋๋ค"๋ ๋ง์ ๊ทธ๋๋ก ๋ฏฟ์ง ์๋๋ค. ์ด ๋ฌธ์ ์ ์ค๋ช
์ ์คํ์ ๊ถํ์ง๋ง, ์ค์ ๋ก ์คํํด๋ correct/wrong ํ ๋ง๋๋ง ๋์์ฌ ๋ฟ ํ๋๊ทธ๋ ๋์ค์ง ์๋๋ค. ์์ฌ์ค๋ฌ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ๋ก ๋๋ ค๋ณด๋ผ๋ ์ ํน์ ์ด ๋ฌธ์ ๋ฐ์์๋ ํํ๋ค โ ์
์ฑ ๋ฐฐ์นยท๋งคํฌ๋ก๊ฐ ์ ํํ ์ด๋ฐ ์์ผ๋ก "๊ทธ๋ฅ ์คํํด๋ณด๋ผ"๊ณ ์ ๋ํ๋ค.
์คํฌ๋ฆฝํธ ๋๋
ํ๋ ์ ์ ์ผ๋ก ๋์ง๋ ๊ฒ ์์ ํ๋ค. ์์ฌ์ค๋ฌ์ด ๋ฐฐ์น๋ฅผ ์ค์ ๋ก ์คํํ๋ฉด ์ํํ ์ ์๋ค. ์ด ๋ฌธ์ ์ฒ๋ผ SET๊ณผ ๋ถ๋ถ ๋ฌธ์์ด ๋ฌธ๋ฒ์ ํ์ฑํด ์ ์ ์ผ๋ก ๋ณต์ํ๋ฉด, ์คํ ์์ด๋ ๊ฒ์ฌ ๋ก์ง๊ณผ ์ ๋ต์ ์์ ํ๊ฒ ๋ฝ์๋ผ ์ ์๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ