[๐ฅ Bronze 1] ์ฃฝ์ ์ฝ๋ ์ Caesar ๋ณตํธ๊ธฐ๋ฅผ ๋์ด๋ฆฌ๋ค โ DreamHack Small Counter ํ์ด โ ZINO2026-07-13ยท1๋ถ ์ฝ๊ธฐยท
๋ฐ์ด๋๋ฆฌ๋ ์คํํด๋ ์นด์ดํฐ๋ง ์ธ๊ณ ๋๋๋ค. flag๋ฅผ ๋ง๋๋ flag_gen์ counter==5์ผ ๋๋ง ๋ถ๋ฆฌ๋๋ฐ ๋ฃจํ๊ฐ 0์์ ๋๋ ์ ๋ ๋๋ฌํ์ง ์๋ ์ฃฝ์ ์ฝ๋๋ค. flag_gen์ด ์ํ๋ฒณ ํ
์ด๋ธ๋ก Caesar ๋ณตํธ๋ฅผ ํ๋ค๋ ๊ฑธ ์ฝ์ด๋ด๊ณ , ์ํธ๋ฌธ IM ์ ๋๊ฐ DH ๋ก ํ๋ฆฌ๋ shift=5๋ฅผ ํ์ ํ ๋ค ๊ทธ ๋ก์ง์ ์ฌํํด flag๋ฅผ ๋ณต์ํ๋ค. GDB๋ก ์ค์ flag_gen์ ์ง์ ํธ์ถํด ๊ฒฐ๊ณผ๊ฐ ์ ํํ ์ผ์นํจ์ ํ์ธํ๋ค.
๋ฌธ์ : DreamHack โ Small Counter
๋ถ๋ฅ: Reversing
๋์ด๋: ๐ฅ Bronze 1
FLAG: DH{389998e56e90e8eb34238948469cecd6dd89c04dce359c345e0b2f3ef9edc66a}
์คํ ํ์ผ ํ๋๊ฐ ์ฃผ์ด์ง๋ค. ๋๋ ค๋ณด๋ฉด ---Counter--- ์๋๋ก 10, 9, โฆ 1์ ์ธ๊ณ ---END---๋ก ๋๋๋ค. flag๋ ์ด๋์๋ ์ ๋์จ๋ค. ์ ์ฐฐํด ๋ณด๋ฉด flag_gen์ด๋ผ๋ ํจ์๊ฐ flag๋ฅผ ๋ง๋ค์ง๋ง, ๊ทธ ํจ์๋ฅผ ๋ถ๋ฅด๋ ๋ถ๊ธฐ๊ฐ ์ ๋ ์คํ๋์ง ์๋ ์ฃฝ์ ์ฝ๋๋ค. ๊ทธ๋์ ์ ์ ์คํ์ผ๋ก๋ flag๋ฅผ ๋ณผ ์ ์๊ณ , flag_gen์ด ๋ฌด์จ ๋ณํ์ ํ๋์ง ์ฝ์ด์ ์์ผ๋ก ๋ณต์ํด์ผ ํ๋ค.
Small Counter โ flag_gen์ Caesar ๋ณตํธ, shift=5๋ก IM ์ ๋๊ฐ DH ๋ก ํ๋ฆฐ๋ค
๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|
| ๋ฌธ์ ๋ช
| Small Counter |
| ๋์ด๋ | ๐ฅ Bronze 1 |
| ๋ถ๋ฅ | Reversing (x86-64 ELF) |
| ์ ๊ณต ํ์ผ | chall (PIE, dynamically linked, not stripped) |
| ํต์ฌ ์ทจ์ฝ์ / ๊ธฐ๋ฒ | ์ฃฝ์ ์ฝ๋ ์์ Caesar ๋ณตํธ ๋ฃจํด์ ์ ์ ์ผ๋ก ๋ณต์ |
flag๋ ์๋ฒ๊ฐ ์๋๋ผ ๋ฐ์ด๋๋ฆฌ ์์ ์ํธ๋ฌธ ํํ๋ก ๋ฐํ ์๋ค. flag_gen์ด ๊ทธ ์ํธ๋ฌธ์ Caesar ๋ณตํธํ๋ฉด flag๊ฐ ๋๋๋ฐ, ์ ์ ์คํ ๊ฒฝ๋ก์์ flag_gen์ด ํธ์ถ๋์ง ์๋๋ค.
์ด ๊ธ์ด ๋์์ด ๋๋์?
๐งฉ ๋ฐฐ๊ฒฝ โ Caesar cipher์ ์ํํธ ํ
์ด๋ธ
Caesar cipher๋ ์ํ๋ฒณ์ ์ผ์ ์นธ์(shift)๋งํผ ๋ฐ์ด ๋ฐ๊พธ๋ ๊ฐ์ฅ ๋จ์ํ ์นํ ์ํธ๋ค. A๋ฅผ 3์นธ ๋ฐ๋ฉด D, B๋ E๊ฐ ๋๋ ์์ด๋ค. ๋ณตํธ๋ ๋ฐ๋๋ก ๊ฐ์ ์นธ์๋งํผ ๋น๊ธฐ๋ฉด ๋๋ค.
์ด ๋ฌธ์ ์ flag_gen์ ์ํํธ๋ฅผ ๋ฃฉ์
ํ
์ด๋ธ๋ก ๊ตฌํํ๋ค. ๋จผ์ abcdefg...z, ABC...Z ๋ ๋ฒ์ ์ํ๋ฒณ์ ์คํ์ ๋ง๋ค๊ณ , ์ธ๋ฑ์ค๋ฅผ shift๋งํผ ์ด๊ธ๋๊ฒ ๋ฐฐ์นํ ํ
์ด๋ธ์ ํ๋ ๋ ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ค ๊ธ์๋ฅผ ๊ทธ ํ
์ด๋ธ์์ ์ฐพ๊ธฐ๋ง ํด๋ ์ํํธ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ฝ๋๋ก ๋ณด๋ฉด ๋ณต์กํด ๋ณด์ด์ง๋ง, ๊ฒฐ๊ตญ ํ๋ ์ผ์ "๊ธ์๋ฅผ shift์นธ ๋น๊ธฐ๋" ๊ฒ๋ฟ์ด๋ค.
ํต์ฌ์ shift ๊ฐ์ ์์๋ด๋ ๊ฒ์ด๋ค. flag ํ์์ด DH{...}์ธ๋ฐ ์ํธ๋ฌธ์ด IM{...๋ก ์์ํ๋ค๋ฉด, I โ D, M โ H๊ฐ ์ฑ๋ฆฝํ๋ shift๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค. I(9๋ฒ์งธ)์์ D(4๋ฒ์งธ)๋ 5์นธ ์ฐจ์ด, M์์ H๋ 5์นธ์ด๋ค. ๊ทธ๋์ shift๋ 5๋ค.
๐ฌ ์ฝ๋ ์ ์ฐฐ โ ์คํํด๋ ์ ๋์ค๋ flag
๋จผ์ ํ์ผ ์ข
๋ฅ์ ์ฌ๋ณผ์ ๋ณธ๋ค. PIE์ stripping์ด ์ ๋ ๋ฐ์ด๋๋ฆฌ๋ผ, ํจ์ ์ด๋ฆ์ด ๊ทธ๋๋ก ๋จ์ ์๋ค.
file/nm โ PIE, not stripped, flag_gen๊ณผ main ์ฌ๋ณผ์ด ๊ทธ๋๋ก ๋
ธ์ถ
flag_gen์ด๋ผ๋ ์ด๋ฆ์ด ๋๋๊ณ ๋ณด์ธ๋ค. ์ฌ๊ธฐ๊ฐ flag๋ฅผ ๋ง๋๋ ๊ณณ์ด๋ค. ๋ค์์ผ๋ก ๋ฌธ์์ด์ ๋ณด๋ฉด ํฅ๋ฏธ๋ก์ด ๊ฒ ๋ ๋ฉ์ด๋ฆฌ ๋์จ๋ค.
strings โ ์ํ๋ฒณ ํ
์ด๋ธ(abcdefghโฆ)๊ณผ ์ํธ๋ฌธ ์กฐ๊ฐ(IM 50888โฆ)
์์ชฝ abcdefghโฆ, ABCDEFGHโฆ๋ flag_gen์ด ์ํํธ ํ
์ด๋ธ์ ๋ง๋ค ๋ ์ฐ๋ ์ํ๋ฒณ์ด๊ณ , ์๋์ชฝ IM{50888, 9j32j87j, โฆ k5jk8jih๋ ์ํธ๋ฌธ ์กฐ๊ฐ์ด๋ค. IM{๋ก ์์ํ๋ ๊ฒ ๋ฐ๋ก ๋์ ๋๋ค โ DH{๋ฅผ 5์นธ ๋ฏผ ๊ฒ์ด๋ค. flag๊ฐ ์ด ์์ ์๋ค๋ ํ์ ์ด ์ ๋ค.
๐งช flag_gen ๋ฏ์ด๋ณด๊ธฐ โ Caesar ๋ณตํธ๊ธฐ
flag_gen(์
๋ ฅ, ์ถ๋ ฅ, shift) ์ธ ์ธ์๋ฅผ ๋ฐ๋๋ค. ๋จผ์ ์คํ์ ๋ ๋ฒ์ ์ํ๋ฒณ ํ
์ด๋ธ์ ์ธ์ด๋ค.
flag_gen โ movabs๋ก ์๋ฌธ์/๋๋ฌธ์ ์ํ๋ฒณ ํ
์ด๋ธ 26์์ฉ ๊ตฌ์ฑ
0x6867666564636261์ ๋ฆฌํ์๋์ธ์ผ๋ก "abcdefgh", ๋ค์์ด "ijklmnop"โฆ ์ด๋ฐ ์์ผ๋ก ์๋ฌธ์ 26์์ ๋๋ฌธ์ 26์๋ฅผ ์คํ์ ๊น์๋๋ค. ๊ทธ ๋ค์ ๋ฃจํ์์ ์ด ํ
์ด๋ธ์ shift๋งํผ ์ด๊ธ๋๊ฒ ์ฌ๋ฐฐ์นํ๋ค.
flag_gen โ (i+shift)%26 ์๋ฆฌ์ ์๋ ๊ธ์๋ฅผ ๋ฃ์ด ์ํํธ ํ
์ด๋ธ ๊ตฌ์ฑ
imul rax, rax, 0x4ec4ec4f ๋ค ์ํํธ ์ฐ์ฐ์ 26์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ์ปดํ์ผ๋ฌ ๊ด์ฉ๊ตฌ๋ค. ๊ฒฐ๊ตญ shifted[(i+shift) % 26] = 'a'+i๋ฅผ 26๋ฒ ๋ฐ๋ณตํ๋ค. ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ํ
์ด๋ธ์์ ์
๋ ฅ ๊ธ์๋ฅผ ์ฐพ์ผ๋ฉด, ๊ทธ ๊ธ์๊ฐ shift์นธ ์์ผ๋ก ๋น๊ฒจ์ง ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์๋ฌธ์๋ 'a' + ((c-'a'-shift) % 26), ๋๋ฌธ์๋ 'A' + ((C-'A'-shift) % 26)๋ก ๋ณตํธ๋๋ ๊ฒ์ด๋ค.
๋ฌธ์ ์ข
๋ฅ๋ __ctype_b_loc๋ก ํ๋ณํ๋ค. ์๋ฌธ์๋ฉด ์๋ฌธ์ ํ
์ด๋ธ, ๋๋ฌธ์๋ฉด ๋๋ฌธ์ ํ
์ด๋ธ์์ ์ฐพ๊ณ , ์ซ์๋ฉด ๋ณ๋ ๊ณ์ฐ์ ํ๋ค. ์ซ์ ์ฒ๋ฆฌ๊ฐ ์กฐ๊ธ ๋
ํนํ๋ค.
flag_gen โ ์ซ์ ๋ถ๊ธฐ: (asciiร(shift+3))%9 ํ rโค7โ'2'..'9', r==8โ'0'
์ซ์ ๋ฌธ์๋ ascii(c) ร (shift+3)์ 9๋ก ๋๋ ๋๋จธ์ง r์ ๊ตฌํ ๋ค, r์ด 7 ์ดํ๋ฉด r+50('2'~'9'), r์ด 8์ด๋ฉด r+40('0')์ผ๋ก ๋งคํํ๋ค. ๊ธ์์ฉ Caesar์๋ ๊ท์น์ด ๋ค๋ฅด์ง๋ง, shift๋ง ์ ํด์ง๋ฉด ๊ฒฐ๊ณผ๋ ์์ ํ ๊ฒฐ์ ๋๋ค. '{', '}' ๊ฐ์ ๋น์์ซ์๋ ๊ทธ๋๋ก ๋ณต์ฌํ๋ค.
๐งญ main ๋ถ์ โ flag_gen์ ์ฃฝ์ ์ฝ๋์๋ค
์ ์ main์ด flag_gen์ ์ด๋ป๊ฒ ๋ถ๋ฅด๋์ง๊ฐ ์ด ๋ฌธ์ ์ ํต์ฌ์ด๋ค. main์ ์นด์ดํฐ๋ฅผ 10๋ถํฐ 1๊น์ง ์ธ๋ ๋ฃจํ๋ฅผ ๋๋ค.
main โ counter=10 ๋ฃจํ, counter==3์ผ ๋ ์ํธ๋ฌธ์ ์คํ์ memcpy
์นด์ดํฐ๊ฐ 3์ด ๋๋ ์๊ฐ, movabs๋ก ์กฐ๋ฆฝํ ์ํธ๋ฌธ "IM{50888โฆ22f}"๋ฅผ ์คํ ๋ฒํผ([rbp-0x50])์ memcpy๋ก ๋ณต์ฌํ๋ค. ์ฆ ์ํธ๋ฌธ์ ๋ฃจํ ๋์ค ์กฐ์ฉํ ์คํ์ ์ฌ๊ธด๋ค. ๋ฃจํ๊ฐ ๋๋ ๋ค๊ฐ ๋ฌธ์ ๋ค.
main โ ๋ฃจํ๋ counter==0์์ ๋๋๋๋ฐ flag_gen ๋ถ๊ธฐ๋ counter==5๋ฅผ ์๊ตฌ(๋๋ฌ ๋ถ๊ฐ)
๋ฃจํ ์กฐ๊ฑด์ counter > 0์ด๋ผ, ์นด์ดํฐ๊ฐ 0์ด ๋๋ฉด ๋น ์ ธ๋์จ๋ค. ๊ทธ ์งํ cmp counter, 5; jne๋ก ๋ถ๊ธฐํ๋๋ฐ, ์นด์ดํฐ๋ ์ด๋ฏธ 0์ด๋ ์ด ๋น๊ต๋ ์ ๋ ์ฐธ์ด ๋ ์ ์๋ค. ๊ทธ๋์ flag_gen์ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋ ๋ธ๋ก(call flag_gen โ printf)์ ์คํ๋์ง ์๊ณ , ํญ์ jne๊ฐ ๊ฑธ๋ ค ---END---๋ง ์ฐ๊ณ ๋๋๋ค. flag๋ฅผ ๋ง๋๋ ์ฝ๋๊ฐ ํต์งธ๋ก ์ฃฝ์ด ์๋ ๊ฒ์ด๋ค.
์ ์ ์คํ์ผ๋ก๋ flag๋ฅผ ๋ชป ๋ณด๋, flag_gen์ ๋ก์ง์ ๊ทธ๋๋ก ์ฌํํด์ ์์ผ๋ก ๋ณตํธํ๋ ์๋ฐ์ ์๋ค.
๐ ์ฝ์ง โ shift๋ ๋ช์ด๊ณ ์ซ์๋ ์ด๋ป๊ฒ ๋๋
โถ๐ ์ฝ์ง โ ์ฃฝ์ ๋ถ๊ธฐ๋ฅผ ์ต์ง๋ก ์คํ์ํค๋ ค๋ค shift ํจ์ ์ ๋น ์ง ๋ป
์ฒ์์ "๊ทธ๋ฅ flag_gen ๋ถ๊ธฐ๋ก ์ ํํ๊ฒ ํจ์นํ๋ฉด ๋์ง"๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฐ๋ฐ main์ ๋ค์ ๋ณด๋ฉด flag_gen์ ๋๊ธฐ๋ shift๊ฐ [rbp-0x8] = [rbp-0x4](์นด์ดํฐ)์ธ๋ฐ, ๋ฃจํ๊ฐ ๋๋ ์์ ์ ์นด์ดํฐ๋ 0์ด๋ค. ๊ทธ๋์ ๋ถ๊ธฐ๋ง ์ต์ง๋ก ์ด๋ ค๋ flag_gen(cipher, 0)์ด ํธ์ถ๋ผ ์๋ฌด๊ฒ๋ ์ ๋ฐ๋ IM{โฆ}์ด ๊ทธ๋๋ก ๋์จ๋ค. shift๋ฅผ ๋ฐ๋ก 5๋ก ๋ฃ์ด์ค์ผ ํ๋ค๋ ๋ป์ด๋ค.
shift๊ฐ 5๋ผ๋ ๊ทผ๊ฑฐ๋ ์ํธ๋ฌธ์ ์์์ด๋ค. IM{์์ I โ D, M โ H๊ฐ ๋๋ ค๋ฉด ์ ํํ 5์นธ์ ๋น๊ฒจ์ผ ํ๋ค. ๋ค๋ฅธ ๊ฐ๋ ๋๋ณผ ์ ์๋๋ฐ, shift 3์ด๋ฉด FJ{, shift 4๋ฉด EI{์ฒ๋ผ flag ํ์์ด ๊นจ์ง๋ค. 5๋ง DH{๋ก ๋จ์ด์ง๊ณ ๋ค์ชฝ hex๋ ๊น๋ํ๊ฒ ๋์จ๋ค.
์ซ์ ๋ถ๊ธฐ๋ ์ ๊น ํท๊ฐ๋ ธ๋ค. r+50, r+40 ๋งคํ์ ๋ณด๊ณ "์๋ ์ซ์๋ฅผ ์ด๋ป๊ฒ ๋ณต์ํ์ง?" ์ถ์๋๋ฐ, ์ด๊ฑด ๋ณต์ํ ํ์๊ฐ ์๋ค. flag_gen์ด ๊ณง ๋ณตํธ๊ธฐ์ด๋ฏ๋ก, ์ํธ๋ฌธ ์ซ์๋ฅผ ๊ทธ ๊ท์น์ ๊ทธ๋๋ก ํต๊ณผ์ํค๋ฉด flag์ ์ซ์๊ฐ ๋๋ค. ๋ฐฉํฅ์ ํท๊ฐ๋ฆฌ์ง๋ง ์์ผ๋ฉด ๋๋ค.
๊ฒฐ๋ก ์ ๊ฐ๋จํ๋ค. ์ํธ๋ฌธ์ flag_gen์ shift 5๋ก ์ ์ฉํ๋ฉด flag๊ฐ ๋๋ค.
๐ฃ ํต์ฌ โ shift=5๋ก ์ฃฝ์ ๋ณตํธ๊ธฐ๋ฅผ ์ฌํ
์ํธ๋ฌธ์ main์ movabs ๊ฐ๋ค์ ๋ฆฌํ์๋์ธ์ผ๋ก ์ด์ด ๋ถ์ด๋ฉด ๋์จ๋ค.
IM{508889j32j87j9jg54650840428hjhi2ii08h74ihj538h543j7g6k5jk8jih22f}
์ฌ๊ธฐ์ flag_gen์ ๊ท์น(์๋ฌธ์ยท๋๋ฌธ์ Caesar ๋ณตํธ, ์ซ์ ๋งคํ, ๋๋จธ์ง ๊ทธ๋๋ก)์ shift 5๋ก ์ ์ฉํ๋ฉด flag๊ฐ ๋ณต์๋๋ค. ๊ธ์๋ 5์นธ ๋น๊ฒจ์ง๊ณ (IM{ โ DH{), ์ซ์๋ ์ซ์ ๊ท์น์ ํ๊ณ , ์ค๊ดํธ๋ ๊ทธ๋๋ก ๋จ๋๋ค.
๐ฏ ์ต์คํ๋ก์ โ ์ฌํ + GDB๋ก ๊ต์ฐจ๊ฒ์ฆ
๋จผ์ flag_gen์ Python์ผ๋ก ์ฌํํ๋ค.
import struct
# main ์ movabs 8๋ฐ์ดํธ(๋ฆฌํ์๋์ธ) ์กฐ๊ฐ + ๋ง์ง๋ง dword ๋ก ์กฐ๋ฆฝ๋๋ ์ํธ๋ฌธ
qwords = [0x38383830357b4d49, 0x6a37386a32336a39, 0x3035363435676a39,
0x6a68383234303438, 0x6838306969326968, 0x3833356a68693437,
0x3667376a33343568, 0x68696a386b6a356b]
cipher = (b"".join(struct.pack("<Q", q) for q in qwords)
+ struct.pack("<I", 0x7d663232)).decode()
def flag_gen(s, shift):
out = []
for ch in s:
o = ord(ch)
if ch.islower(): # 'a'+((c-'a'-shift)%26)
out.append(chr(ord('a') + (o - ord('a') - shift) % 26))
elif ch.isupper():
out.append(chr(ord('A') + (o - ord('A') - shift) % 26))
elif ch.isdigit(): # (ascii*(shift+3))%9
r = (o * (shift + 3)) % 9
out.append(chr(r + 50) if r <= 7 else chr(r + 40))
else:
out.append(ch) # '{', '}' ๋ฑ์ ๊ทธ๋๋ก
return "".join(out)
print("[+] FLAG :", flag_gen(cipher, 5))
์ฌํ์ด ๋ง๋์ง ๋ฏฟ์ผ๋ ค๋ฉด, ์ค์ ๋ฐ์ด๋๋ฆฌ์ flag_gen์ ์ง์ ๋ถ๋ฌ ๋น๊ตํ๋ ๊ฒ ํ์คํ๋ค. not stripped๋ผ GDB์์ ์ฌ๋ณผ๋ก ๋ฐ๋ก ํธ์ถํ ์ ์๋ค. main์ ๋ฉ์ถ ๋ค, malloc์ผ๋ก ๋ฒํผ๋ฅผ ์ก๊ณ ์ํธ๋ฌธ์ ๋ฃ์ด flag_gen(cipher, 5)๋ฅผ ํธ์ถํ๋ค.
GDB โ ์ค์ flag_gen(cipher, 5) ํธ์ถ ๊ฒฐ๊ณผ๊ฐ ์ฌํ๊ณผ ์ผ์น, shift 3ยท4๋ ์ฐ๋ ๊ธฐ
์ค์ flag_gen(cipher, 5)๊ฐ DH{389998e56e90e8ebโฆf9edc66a}๋ฅผ ๊ทธ๋๋ก ๋ฑ๋๋ค. ๋์กฐ์ฉ์ผ๋ก shift 3, 4๋ฅผ ๋ฃ์ผ๋ FJ{โฆ, EI{โฆ์ฒ๋ผ ํ์์ด ๊นจ์ง๋ค. shift 5๊ฐ ์ ์ผํ๊ฒ ๋ง๋ค๋ ๊ฒ ์คํ์ผ๋ก ํ์ธ๋๋ค.
๐ Full Exploit
์ฌํ ์คํฌ๋ฆฝํธ๋ฅผ ๊ทธ๋๋ก ๋๋ฆฌ๋ฉด flag๊ฐ ๋์จ๋ค.
import struct
qwords = [0x38383830357b4d49, 0x6a37386a32336a39, 0x3035363435676a39,
0x6a68383234303438, 0x6838306969326968, 0x3833356a68693437,
0x3667376a33343568, 0x68696a386b6a356b]
cipher = (b"".join(struct.pack("<Q", q) for q in qwords)
+ struct.pack("<I", 0x7d663232)).decode()
def flag_gen(s, shift):
out = []
for ch in s:
o = ord(ch)
if ch.islower():
out.append(chr(ord('a') + (o - ord('a') - shift) % 26))
elif ch.isupper():
out.append(chr(ord('A') + (o - ord('A') - shift) % 26))
elif ch.isdigit():
r = (o * (shift + 3)) % 9
out.append(chr(r + 50) if r <= 7 else chr(r + 40))
else:
out.append(ch)
return "".join(out)
print("[*] cipher :", cipher)
print("[+] FLAG :", flag_gen(cipher, 5))
solve.py ์คํ โ ์ํธ๋ฌธ๊ณผ ๋ณต์๋ flag ์ถ๋ ฅ
[*] cipher : IM{508889j32j87j9jg54650840428hjhi2ii08h74ihj538h543j7g6k5jk8jih22f}
[+] FLAG : DH{389998e56e90e8eb34238948469cecd6dd89c04dce359c345e0b2f3ef9edc66a}
๐ ๊ฒฐ๋ก
"์คํํ๋ฉด ์ ๋์จ๋ค"๊ณ flag๊ฐ ์๋ ๊ฒ ์๋๋ค.
์ด ๋ฌธ์ ์ ํจ์ ์ flag ์์ฑ ์ฝ๋๊ฐ ์ด์ ์์ง๋ง ํธ์ถ๋์ง ์๋ ์ฃฝ์ ์ฝ๋๋ผ๋ ์ ์ด๋ค. ์นด์ดํฐ ๋ฃจํ๋ 0์์ ๋๋๋๋ฐ flag_gen ๋ถ๊ธฐ๋ ์นด์ดํฐ๊ฐ 5์ฌ์ผ ์คํ๋๋, ์ ์ ํ๋ฆ์์ ์์ํ ๋ฟ์ง ์๋๋ค. ๋ฆฌ๋ฒ์ฑ์์ ์คํ ๊ฒฐ๊ณผ๋ง ๋ณด๊ณ ํ๋จํ๋ฉด ์ด๋ฐ ์ฝ๋๋ฅผ ํต์งธ๋ก ๋์น๋ค. ์ฌ๋ณผ(flag_gen)๊ณผ ๋ฌธ์์ด(IM{โฆ), ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์กฐ๊ฑด์์ ์ด๋ค ์ฝ๋๊ฐ ์คํ๋๋์ง๋ฅผ ์ ์ ์ผ๋ก ์ฝ์ด์ผ ์ ์ฒด ๊ทธ๋ฆผ์ด ๋ณด์ธ๋ค.
Caesar cipher๋ ์ํธ๊ฐ ์๋๋ผ ์ธ์ฝ๋ฉ์ด๋ค.
flag๋ฅผ ์ํํธ ํ
์ด๋ธ๋ก "์จ๊ฒผ์ง๋ง", ์ํธ๋ฌธ์ ์ฒซ ๊ธ์๋ง ๋ด๋ shift๊ฐ ๋๋ฌ๋๋ค. DH{๋ผ๋ ์๋ ค์ง ์ ๋์ฌ๊ฐ IM{๋ก ๋ํ๋๋ ์๊ฐ shift=5๋ ํ์ ๋๋ค. ์ด๋ฐ ๊ณ ์ ์ ๋์ฌ(known-plaintext)๊ฐ ์์ผ๋ฉด ์ํํธยทXOR ๊ณ์ด ์ธ์ฝ๋ฉ์ ์ฆ์ ๋ซ๋ฆฐ๋ค. ๊ฐ์ ์ ๋ง ๊ฐ์ถ๋ ค๋ฉด ํค๊ฐ ์๋ ์ง์ง ์ํธ๋ฅผ ์จ์ผ ํ๊ณ , ๊ทธ ํค๋ฅผ ๋ฐ์ด๋๋ฆฌ ์์ ๊ฐ์ด ๋ฃ์ผ๋ฉด ๊ฒฐ๊ตญ ์ด๋ ๊ฒ ์ ์ ๋ถ์์ผ๋ก ๋ณต์๋๋ค. ํด๋ผ์ด์ธํธ์ ์ค ๋ฐ์ด๋๋ฆฌ ์์ ์๋ ๋น๋ฐ์ ๋น๋ฐ์ด ์๋๋ค.
+4
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ