๋ฌธ์ : DreamHack โ Enc-JPG ๋ถ๋ฅ: Reversing + Forensics ๋์ด๋: ๐ฅ Gold 4 FLAG:
DH{How_ENc_ECrypt_yo}
๋ฌธ์ ๊ฐ์
| ๋ฐฐํฌ๋ฌผ | Enc (PE32+ x86-64 ์ฝ์, 12KB), flag.jpg (7,415 B) |
| ์๋ฒ | ์์ (needs_vm: false) |
| ํต์ฌ ๊ธฐ๋ฒ | RC4 ๋ณํ ์ญ์ฐ ยท ํ์ผ ์นด๋น ยท JPEG ํค๋ ์ด์ ยท PNG ์ฒญํฌ ๋ณต๊ตฌ |
๋ฌธ์ ์ค๋ช ์ด ์งง์ง๋ง ์ ๋ณด๊ฐ ๊ฝค ๋ค์ด ์๋ค.
๋๋ฆผ์ด๊ฐ JPGํ์ผ ๋ง๋๋ ์ค์ ๋ณ์กฐ๊ฐ ๋์์ด์!! JPGํ์ผ์ด ๋จ๋จํ ์ด์ํ๋ค์โฆ?? ๋ฌธ์ ํ์ผ์ด ํ๋ ์๋ชป์์ฑ ๋์์ต๋๋ค. ใ -ใ ๋ง์ง๋ง ์ฌ์ง ํ๋๊ทธ ๊ธ์์๋ 4๊ฐ์ ๋๋ค.
DH{JPG_TXT_PNG}
๋ง์ง๋ง ์ค์ ๋๋ ์ฒ์์ "ํ๋๊ทธ ํ์์ ์ด๋ ๊ฒ ์๊ฒผ๋ค"๋ ์์๋ก ์ฝ์๋ค. ๋ค ํ๊ณ ๋์์ผ ์กฐ๊ฐ์ด JPGยทTXTยทPNG ์ธ ๊ณณ์์ ๋์จ๋ค๋ ๊ตฌ์ฑ ์๋ด์๋ค๋ ๊ฑธ ์์๋ค. ๊ทธ๋ฆฌ๊ณ "์๋ชป์์ฑ"๊ณผ "๋ง์ง๋ง ์ฌ์ง 4๊ธ์"๋ ๋ง์ง๋ง ๋จ๊ณ์์ ์ ํํ ๋ค์ด๋ง๋๋ค. ๋ฏธ๋ฆฌ ์๊ณ ๋ดค์ผ๋ฉด ํจ์ฌ ๋นจ๋์ ํ ๋ฐ, ์์๋๋ก ์ ์ด ๋ณธ๋ค.
1. ์ ์ฐฐ
๋ฐ์ ๊ฒ ๋ญ์ง๋ถํฐ ๋ณธ๋ค.
cd extracted
ls -la && file Enc flag.jpg
flag.jpg๊ฐ data๋ก ์กํ๋ค. ํ์ฅ์๋ง jpg ๊ณ ๋ด์ฉ์ JPEG ์ด ์๋๋ผ๋ ๋ป์ด๋ค. ์ 4๋ฐ์ดํธ๊ฐ
ff d8 ff e0์ด ์๋๋ผ๋ ์๊ธฐ์ด๊ณ , ๊ทธ๋ฌ๋ Enc๊ฐ ์ด ํ์ผ์ ๋ญ๊ฐ ์ฅ๋ณธ์ธ์ผ ๊ฒ์ด๋ค.
์๋์ฐ ๋ฐ์ด๋๋ฆฌ๋ผ ๋ฆฌ๋ ์ค์์ ์คํํ ์๋ ์๋ค. ์ ์ ๋ถ์์ผ๋ก ๊ฐ๋ค. ๋ฌธ์์ด๋ถํฐ.
strings -n 5 Enc | grep -iE "funfun|flag|r\\+b|Project2"
funfun์ด ๋์ ๋๋ค. ๊ธธ์ด 6์ง๋ฆฌ ์๋จ์ด ๋ฐ๋ณต์ด๋ผ ํค์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. flag.jpg์ r+b๊ฐ
๊ฐ์ด ์๋ ๊ฒ๋ ์์ฐ์ค๋ฝ๋ค โ ํ์ผ์ ์ฝ๊ธฐยท์ฐ๊ธฐ ๊ฒธ์ฉ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๋ก ์ฐ๋ค๋ ๊ฑด ์ ์๋ฆฌ์์
๊ณ ์ณ ์ด๋ค(in-place)๋ ๋ป์ด๋ค.
์น์ ๋ฐฐ์น๋ ๋ด ๋๋ค.
objdump -h Enc | sed -n "4,12p"
.text๊ฐ 4KB ๋จ์ง์ด๋ผ ํจ์๊ฐ ๋ช ๊ฐ ์๋ค. ์ด ์ ๋๋ฉด ์ ๋ถ ์ฝ์ด๋ ๋๋ค.
๋ฌธ์์ด์ด .rdata ์ด๋์ ์๋์ง ํ์ธํด ๋๋ฉด ์ฐธ์กฐ ์ง์ ์ ์ฐพ๊ธฐ ์ฝ๋ค.
objdump -s -j .rdata Enc | grep -iE "funfun|flag"
์ฃผ์๊ฐ ๋์๋ค. funfun์ 0x140003280, flag.jpg๋ 0x140003290์ด๋ค. ์ด์ ์ด๊ฑธ ๊ฐ๋ฆฌํค๋
lea ๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค. ๋ ๊ตฐ๋ฐ๊ฐ ๋์๋ค โ 0x140001043๊ณผ 0x140001277. ์ฆ ํ์ผ์ ์ฌ๋ ํจ์๊ฐ
๋์ด๋ค. ํ๋๋ sub_140001000, ๋ค๋ฅธ ํ๋๋ ๊ทธ๊ฑธ ํธ์ถํ๋ main(0x140001240)์ด๋ค.
์ ๋ฆฌํ๋ฉด ์ด ํ๋ก๊ทธ๋จ์ flag.jpg๋ฅผ ๋ ๋ฒ ํ๋๋ค.
2. 1๋จ๊ณ โ RC4๋ฅผ ๋ฎ์์ง๋ง ์๋ ๊ฒ
sub_140001000๋ถํฐ ์ฝ๋๋ค. ์๋ถ๋ถ์ ํ๋ฒํ๋ค. funfun\0 7๋ฐ์ดํธ๋ฅผ ์คํ([rbp+0x28])์
๋ณต์ฌํ๊ณ , fopen_s(&f, "flag.jpg", "r+b")๋ก ์ด๊ณ , fread(buf, 1, 0x400, f)๋ก 1024๋ฐ์ดํธ๋ฅผ ์ฝ๋๋ค.
๊ทธ ๋ค์ ํค ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฃจํ(or rdx,-1 โ inc rdx โ cmp byte[rax+rdx],0)๊ฐ ๋์
rdx = 6์ด ๋๋ค.
์ฌ๊ธฐ์๋ถํฐ๊ฐ ๋ณธ๋ก ์ด๋ค.
์ฃผ์์ tools/annot_ksa.sed ๋ก ์น์๋ค. ; ๋ค๊ฐ ๋ด๊ฐ ๋ถ์ธ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ objdump ์๋ฌธ์ด๋ค.
s|\(and rax,rdx\)|\1 ; โ
i % 6 ์ด ์๋๋ผ i \& 6|
s|\(mov al,BYTE PTR \[rbp+rax\*1+0x28\]\)|\1 ; K[i] = key[i \& 6]|
s|\(mov BYTE PTR \[rbp+rcx\*1+0x30\],r8b\)|\1 ; S[i] = i|objdump -d Enc -M intel --start-address=0x1400010d5 --stop-address=0x1400010f9 \
| sed -n "8,20p" | sed -f ../tools/annot_ksa.sed![ํด๋ฆญํ์ฌ ํ๋ objdump ๋ก ๋ณธ KSA ์ด๊ธฐํ ๋ฃจํ์ sed ๋ก ์ฃผ์์ ์น์๋ค โ S[i]=i ๋ฅผ ์ฑ์ฐ๋ฉด์ K[i]=key[i & 6] ๋ก ํค๋ฅผ ํ์ฅํ๋ค](/_next/image?url=%2Fimages%2Fblog%2Fdreamhack-enc-jpg-writeup%2F05_ksa.png&w=3840&q=75)
RC4 ์ ํค ์ค์ผ์ค์ด ๋ง๋ค. S[i] = i๋ก ์ฑ์ฐ๊ณ K[i]์ ํค๋ฅผ ๋ฐ๋ณตํด ๋ฃ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ช
๋ น์ด
and rax,rdx ๋ค. ํ์ค RC4 ๋ K[i] = key[i % keylen]์ธ๋ฐ ์ด๊ฑด key[i & 6]์ด๋ค.
i & 6์ด ๋ผ ์ ์๋ ๊ฐ์ {0, 2, 4, 6} ๋ท๋ฟ์ด๋ค. ์ฆ ์ค์ ๋ก ์ฐ์ด๋ ํค ๋ฐ์ดํธ๋
i & 6 | ํค ๋ฐ์ดํธ |
|---|---|
| 0 | 'f' (0x66) |
| 2 | 'n' (0x6e) |
| 4 | 'u' (0x75) |
| 6 | '\0' (0x00) โ ๋ฌธ์์ด ๋ ๋ |
๋ท์ด๊ณ , funfun์ ๋ ๋ฒ์งธยท๋ค ๋ฒ์งธยท์ฌ์ฏ ๋ฒ์งธ ๊ธ์(u, f, n)๋ ํ ๋ฒ๋ ์ ์ฐ์ธ๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํํ ๊ฒ ์๋๋ผ ์์ค๊ฐ ์๋ &์์ ๊ฒ์ด๋ค. ์ด๋ ์ชฝ์ด๋ ๊ทธ๋๋ก ๋ฒ ๊ปด์ผ ํ๋ค.
KSA ๋ณธ์ฒด(0x1400010f9)๋ ํ์ค ๊ทธ๋๋ก๋ค. j = (j + K[i] + S[i]) & 0xff ํ๊ณ S[i]์ S[j]๋ฅผ ๋ง๋ฐ๊พผ๋ค.
and edi,0x800000ff ๋ค์ ๋ถ์ ๋ถํธ ๋ณด์ 3์ค์ ์ปดํ์ผ๋ฌ๊ฐ ๋ถํธ ์๋ ์ ์๋ก ๋๋จธ์ง๋ฅผ ํ๋ด ๋ธ ๊ฒ์ด๋ผ
๊ฒฐ๊ณผ์ ์ผ๋ก๋ & 0xff์ ๊ฐ๋ค.
ํค์คํธ๋ฆผ์ ๋ฝ๋ PRGA ์์ ๋ ๋ฒ์งธ ์ฐจ์ด๊ฐ ๋์จ๋ค.
์ฃผ์์ tools/annot_prga.sed ๋ก ์น์๋ค. ; ๋ค๊ฐ ๋ด๊ฐ ๋ถ์ธ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ objdump ์๋ฌธ์ด๋ค.
s|\(movzx ecx,BYTE PTR \[rbp+rax\*1+0x30\]\)|\1 ; S[t]|
s|\(mov al,BYTE PTR \[rbp+rcx\*1+0x30\]\)|\1 ; โ
S[S[t]] โ ํ ๋ฒ ๋ ์ธ๋ฑ์ฑ|
s|\(xor BYTE PTR \[rbp+r8\*1+0x130\],al\)|\1 ; buf[n] ^= keystream|objdump -d Enc -M intel --start-address=0x14000118d --stop-address=0x1400011b2 \
| sed -n "8,16p" | sed -f ../tools/annot_prga.sed![ํด๋ฆญํ์ฌ ํ๋ objdump ๋ก ๋ณธ PRGA ๋๋ถ๋ถ โ S[(S[i]+S[j])&0xff] ๋ฅผ ๊ตฌํ ๋ค ๊ทธ ๊ฐ์ผ๋ก S ๋ฅผ ํ ๋ฒ ๋ ์ธ๋ฑ์ฑํ๋ค](/_next/image?url=%2Fimages%2Fblog%2Fdreamhack-enc-jpg-writeup%2F06_prga.png&w=3840&q=75)
t = (S[i] + S[j]) & 0xff๊น์ง๋ ๊ฐ๋ค. ํ์ค์ด๋ผ๋ฉด S[t]๊ฐ ํค์คํธ๋ฆผ ๋ฐ์ดํธ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ๋
movzx ecx, [rbp+rax+0x30]์ผ๋ก S[t]๋ฅผ ๊บผ๋ธ ๋ค, ๊ทธ ๊ฐ์ ๋ค์ ์ธ๋ฑ์ค๋ก ์จ์
mov al, [rbp+rcx+0x30] ์ ํ ๋ฒ ๋ ํ๋ค. ์ฆ S[S[t]] ๋ค.
์ด๊ฒ๋ง์ผ๋ก๋ ํ์ค RC4 ๊ตฌํ์ ๊ฐ๋ค ์ฐ๋ฉด ์ ๋๋ค๋ ๊ฒ ํ์คํด์ง๋ค. ์ฌ๊ธฐ๊น์ง ์ฝ๊ณ ๋๋
"ํค funfun, & ํ์ฅ, ์ด์ค ์ธ๋ฑ์ฑ" ์ธ ๊ฐ์ง๋ฅผ ๋ฐ์ํด ๋ณตํธ๊ธฐ๋ฅผ ์งฐ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ ธ๋ค.
๐ง ์ฝ์ง โ ํค๋๋ง ์ด์๋๊ณ ๋๋จธ์ง๊ฐ ์ ๋ถ ๊นจ์ก๋ค
์ฒญํฌ๋ง๋ค S ๋ฐ์ค๋ฅผ ์๋ก ๋ง๋ ๋ค๋ ๊ฑธ ๋์น๊ณ ์คํธ๋ฆผ์ ํ์ผ ์ ์ฒด์ ๊ณ์ ์ด์ด์ ๋๋ฆฐ ๋ฒ์ ์ด๋ค.
# โ ์๋ชป๋ ๋ฒ์ โ S ๋ฐ์ค๋ฅผ ํ์ผ ์ ์ฒด์ ํ ๋ฒ๋ง ๋ง๋ ๋ค
S, j = ksa(KEY), 0
out = bytearray(data)
for n in range(len(out)):
out[n] ^= prga_next(S) # ์ฒญํฌ ๊ฒฝ๊ณ๋ฅผ ๋ฌด์ํ๊ณ ๊ณ์ ์ด์ด ๊ฐ๋ค
open("wrong_stream.jpg", "wb").write(out)์ 4๋ฐ์ดํธ๊ฐ ff d8 ff e0์ผ๋ก ์ ํํ ๋์ค๊ณ file๋ JPEG ์ผ๋ก ์ก๋๋ฐ,
์ ์ ๊ทธ๋ฆผ์ ์์ชฝ ๋ช ์ค๋ง ๋ฉ์ฉกํ๊ณ ์๋๊ฐ ์ ๋ถ ๋
ธ์ด์ฆ์๋ค.
์๋๋ ๊ทธ๋ ๊ฒ ๋์จ wrong_stream.jpg ๋ฅผ ์ด๋ฏธ์ง ๋ทฐ์ด๋ก ์ฐ ํ๋ฉด์ด๋ค.

"ํค๋๋ ๋ง๋๋ฐ ๋ค๊ฐ ํ๋ฆฌ๋ค"๋ ๊ฑด ์ 1024๋ฐ์ดํธ๋ง ํค์คํธ๋ฆผ์ด ๋ง์๋ค๋ ๋ป์ด๋ค.
1024๋ ์๊น fread์ ๋๊ธด 0x400์ด๋ค. ์ฐ์ฐ์ผ ๋ฆฌ๊ฐ ์๋ค.
๊ทธ๋์ ํจ์ ๋์ ๋ค์ ๋ดค๋ค.
์ฃผ์์ tools/annot_loop.sed ๋ก ์น์๋ค. ; ๋ค๊ฐ ๋ด๊ฐ ๋ถ์ธ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ objdump ์๋ฌธ์ด๋ค.
s|\(je 0x14000108e\)|\1 ; โ
๋ณต๊ท์ ์ด ftell ์ง์ = S๋ฐ์ค ์ด๊ธฐํ๊ฐ ๋ฃจํ ์|
s|\(call QWORD PTR \[rip+0x1f82\)|\1 ; feof|objdump -d Enc -M intel --start-address=0x1400011f4 --stop-address=0x140001210 \
| sed -n "8,14p" | sed -f ../tools/annot_loop.sed
feof๊ฐ 0์ด๋ฉด je 0x14000108e๋ก ์ ํํ๋ค. 0x14000108e๋ ftell ์ง์ , ์ฆ S ๋ฐ์ค ์ด๊ธฐํ๋ณด๋ค
์์ด๋ค. ๋ค์ ๋งํด ์ด ํจ์๋ ํ์ผ ์ ์ฒด๋ฅผ 1024๋ฐ์ดํธ์ฉ ๋๋ฉด์ ๋งค ์ฒญํฌ๋ง๋ค S ๋ฐ์ค๋ฅผ ์ฒ์๋ถํฐ
๋ค์ ๋ง๋ ๋ค. ํค์คํธ๋ฆผ์ด ์ด์ด์ง์ง ์๋๋ค.
ํ ๊ฐ์ง ๋ ์๋ค. KSA ๊ฐ ์ฐ๋ j(๋ ์ง์คํฐ edi)๋ ๋ฃจํ ๋ฐ 0x140001059์์ ๋ฑ ํ ๋ฒ๋ง
0์ด ๋๋ค. PRGA ์ง์ (0x14000113d)์์ ๋ค์ 0์ผ๋ก ์ด๊ธฐํ๋๋, KSA ๋ ์ ์ฒญํฌ PRGA ๊ฐ ๋๋ฌ์ ๋์
j ๊ฐ์ ์ด์ด๋ฐ์ ์์ํ๋ค. ๊ทธ๋์ ์ฒญํฌ๋ง๋ค S ๋ฐ์ค๋ ์๋ก ๋ง๋ค์ด์ง๋ ๋งค๋ฒ ๋ค๋ฅธ ๋ฐฐ์ด์ด ๋์จ๋ค.
์ด ๋ ์ค์ด ๋น ์ ธ์ ๋ ์๊ฐ์ ๋ ๋ ธ๋ค. ๋์ค์ด์ ๋ธ๋ฆฌ์์ ๋ฃจํ์ ๋ณต๊ท ์ง์ ์ ํ์ธํ์ง ์๊ณ "ํจ์ ํ๋ = ์คํธ๋ฆผ ํ๋"๋ผ๊ณ ๋๊ฒจ์ง์ ๊ฒ ์์ธ์ด๋ค.
ํ์ผ์ ์ด๋ป๊ฒ ํ๋๊ฐ
์ํธ ์์ฒด์ ๋ณ๊ฐ๋ก, ์ด ํจ์๊ฐ ํ์ผ์ ๋ค๋ฃจ๋ ๊ณจ๊ฒฉ๋ ๋ด ๋ ํ์๊ฐ ์๋ค. ์ํฌํธ ์ฃผ์๋ฅผ ํธ์ถ ์ธ์์ ๋ง์ถฐ ๋ณด๋ฉด ์ด๋ ๊ฒ ์ ๋ฆฌ๋๋ค.
| IAT ์ฃผ์ | ํจ์ | ๊ทผ๊ฑฐ |
|---|---|---|
0x140003188 | fopen_s | (&f, "flag.jpg", "r+b") 3์ธ์ |
0x140003180 | feof | ์ธ์๊ฐ FILE* ํ๋, ๋ฐํ 0 ์ด๋ฉด ๋ฃจํ ๊ณ์ |
0x1400031a8 | ftell | ์ธ์ FILE* ํ๋, ๋ฐํ๊ฐ์ ๋์ค์ fseek ์คํ์
์ผ๋ก ์ |
0x140003178 | fread | (buf, 1, 0x400, f) |
0x140003190 | fwrite | (buf, 1, ์ฝ์์, f) |
0x1400031b0 | fseek | (f, ์คํ์
, 0) โ ์ธ ๋ฒ์งธ ์ธ์ r8d = 0 = SEEK_SET |
ํ ๋ฐํด๋ ftell ๋ก ํ์ฌ ์์น ๊ธฐ์ต โ fread โ ๋ณํ โ ๊ธฐ์ตํ ์์น๋ก fseek โ fwrite โ ์ฝ๊ธฐ ๋๋
์์น๋ก ๋ค์ fseek ์ด๋ค. ์ ์๋ฆฌ ๊ฐฑ์ ์ด๋ผ r+b ๋ก ์ฐ ์ด์ ๊ฐ ์ฌ๊ธฐ์ ๋๋ฌ๋๋ค. ์๋ณธ์ ๋จ๊ธฐ์ง ์์ผ๋
flag.jpg ๋ ์ด๋ฏธ ๋ ๋ฒ ๋ฎ์ด์จ์ง ์ํ๋ก ๋ฐฐํฌ๋ ๊ฒ์ด๋ค.
์ ๋ฆฌํ๋ฉด 1๋จ๊ณ๋ ์ด๋ ๋ค.
| ํ์ค RC4 | Enc.exe | |
|---|---|---|
| ํค ํ์ฅ | K[i] = key[i % keylen] | K[i] = key[i & 6] |
| ํค์คํธ๋ฆผ | S[(S[i]+S[j]) & 0xff] | S[ S[(S[i]+S[j]) & 0xff] ] |
| ์ฒญํฌ ๊ฒฝ๊ณ | ์คํธ๋ฆผ ์ฐ์ | ์ฒญํฌ๋ง๋ค S ๋ฐ์ค ์ฌ์์ฑ, KSA ์ j ๋ง ์ด์ด๋ฐ์ |
3. 2๋จ๊ณ โ ์ธ๋ฑ์ค ํ์ง XOR
main์ 1๋จ๊ณ ํจ์๋ฅผ ๋ถ๋ฅธ ๋ค ํ์ผ์ ๋ค์ ์ฐ๋ค. ์ด๋ฒ์ ํจ์ฌ ๋จ์ํ๋ค.
์ฃผ์์ tools/annot_st2.sed ๋ก ์น์๋ค. ; ๋ค๊ฐ ๋ด๊ฐ ๋ถ์ธ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ objdump ์๋ฌธ์ด๋ค.
s|\(test dl,0x1\)|\1 ; ์ธ๋ฑ์ค ํ์ง ํ์ |
s|\(xor cl,0x85\)|\1 ; ์ง์|
s|\(xor cl,0x44\)|\1 ; ํ์|objdump -d Enc -M intel --start-address=0x1400012cb --stop-address=0x1400012ef \
| sed -n "8,18p" | sed -f ../tools/annot_st2.sed
test dl,0x1๋ก ์ธ๋ฑ์ค์ ์ตํ์ ๋นํธ๋ฅผ ๋ณด๊ณ ์ง์๋ฉด ^0x85, ํ์๋ฉด ^0x44 ํ๋ค. ์ญ์
0x400์ฉ ์ฝ์ด ์ฒ๋ฆฌํ๊ณ ๋์ด๋ค. ์ฒญํฌ ํฌ๊ธฐ๊ฐ ์ง์๋ผ ์ฒญํฌ๊ฐ ๋๋์ด๋ ์ ์ญ ํ์ง์ด ์ด๊ธ๋์ง ์๋๋ค.
๊ทธ๋์ ํ์ผ ์ ์ฒด๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค.
cmp rdx,rdi; jbe ๋ผ ์ฝ์ ๋ฐ์ดํธ ์๋ณด๋ค ํ๋ ๋ XOR ํ๋ ์คํ๋ฐ์ด์์ด ์๋๋ฐ,
fwrite๋ ์ฝ์ ๋งํผ๋ง ์ฐ๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅ์๋ ์ํฅ์ด ์๋ค. ์คํ ํ ๋ฐ์ดํธ๋ฅผ ๊ฑด๋๋ฆฌ๊ณ ๋ง ๋ฟ์ด๋ค.
๋ ๋จ๊ณ ๋ชจ๋ XOR ์ด๋ผ ๋ณตํธ๋ ๊ฐ์ ์ฐ์ฐ์ด๊ณ , XOR ์ ๊ตํ๋ฒ์น์ด ์ฑ๋ฆฝํ๋ ์์๋ ์๊ด์๋ค.
4. ๋ณตํธ๊ธฐ
์ฝ์ ๊ทธ๋๋ก ์ฎ๊ธด๋ค. ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ ์๋ค.
KEY = b"funfun\x00" # ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ์ ๋ณต์ฌํ๋ 7๋ฐ์ดํธ ๊ทธ๋๋ก
CHUNK = 0x400 # fread/fwrite ๋จ์. 1ยท2๋จ๊ณ ๋ชจ๋ ์ด ํฌ๊ธฐ๋ก ๋๋ค
def rc4_variant(data, j_carry=0, key=KEY):
"""ํ ์ฒญํฌ. ๋ฐํ (๊ฒฐ๊ณผ, ๋ค์ ์ฒญํฌ KSA ๋ก ๋๊ธธ j)."""
klen = len(key) - 1 # strlen("funfun") = 6
K = bytes(key[i & klen] for i in range(256)) # โ i % klen ์ด ์๋๋ผ i & klen
S = list(range(256))
j = j_carry # โก KSA ์ ์ j ๋ฅผ 0 ์ผ๋ก ์ ๋๋ฆฐ๋ค
for i in range(256):
j = (j + K[i] + S[i]) & 0xFF
S[i], S[j] = S[j], S[i]
out = bytearray(data)
i = j = 0 # PRGA ์ง์ ์๋ง j = 0
for n in range(len(data)):
i = (i + 1) & 0xFF
j = (j + S[i]) & 0xFF
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) & 0xFF
out[n] ^= S[S[t]] # โข S[t] ๊ฐ ์๋๋ผ S[S[t]]
return bytes(out), j
def stage2(data):
"""์ธ๋ฑ์ค ํ์ง XOR. ์๊ธฐ์ญํจ์."""
return bytes(b ^ (0x44 if n & 1 else 0x85) for n, b in enumerate(data))
def stage1(data):
"""์ฒญํฌ๋ง๋ค S ๋ฐ์ค๋ฅผ ์๋ก ๋ง๋ค๋ KSA ์ j ๋ง ์ด์ด๋ฐ๋๋ค. ์๊ธฐ์ญํจ์."""
out, j = [], 0
for o in range(0, len(data), CHUNK):
blk, j = rc4_variant(data[o:o + CHUNK], j)
out.append(blk)
return b"".join(out)
def decrypt(enc):
return stage1(stage2(enc)) # ์ํธํ๊ฐ 1โ2 ์์ผ๋ ๋ณตํธ๋ 2โ1๋๋ ค ๋ณด๋ฉด ์ด๋ ๊ฒ ๋์จ๋ค.

ff d8 ff e0์ผ๋ก ์์ํ๊ณ file์ด 303x64 JPEG ์ผ๋ก ์ก๋๋ค. ๊ทธ๋ฆผ๋ ๋ฉ์ฉกํ๋ค.

๋ฉ๋ชจ์ฅ ๋ฉ๋ด๋ฐ๋ค. ๊ทธ๋ฐ๋ฐ ํ๋๊ทธ๊ฐ ์๋ค. 303ร64๋ฉด ๋ฉ๋ด๋ฐ ๋ฑ ํ ์ค ๋์ด๋ผ ์๋๊ฐ ์์ ์๋ค.
๋ณตํธ๊ฐ ๋ง๋์ง ์ด๋ป๊ฒ ํ์ ํ๋
"ํค๋๊ฐ ๋ง์ผ๋ฉด ๋ณตํธ๊ฐ ๋ง๋ค"๋ ๊ฑด ์์์ ์ด๋ฏธ ํ ๋ฒ ํ๋ ธ๋ค. ๊ทธ๋์ ์ด๋ฒ์ ์ธ ๊ฐ์ง๋ก ๊ต์ฐจ ํ์ธํ๋ค.
- JPEG ๊ตฌ์กฐ๊ฐ ๋๊น์ง ํ์ฑ๋๋ค. SOI ๋ถํฐ EOI ๊น์ง ๋ง์ปค ๊ธธ์ด๊ฐ ์ ๋ถ ๋ง๊ณ , ์ค๊ฐ์ ์ ์๋์ง ์์ ๋ง์ปค๊ฐ ๋์ค์ง ์๋๋ค. ํค์คํธ๋ฆผ์ด ์ด๊ธ๋๋ฉด ์์ถ ๋ฐ์ดํฐ๊ฐ ๊นจ์ ธ ๋์ฝ๋๊ฐ ์ค๊ฐ์ ๋ฉ์ถ๋ค.
- ๊ทธ๋ฆผ์ด ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ๋ ธ์ด์ฆ๊ฐ ์๋๋ผ ์ฝ์ ์ ์๋ ํ๊ธ ๋ฉ๋ด ๋ฌธ์์ด์ด ๋์จ๋ค. ์ด๊ฑด ์ฐ์ฐ์ผ๋ก ๋์ฌ ์ ์๋ค.
- ๋ค์ชฝ PNG ์ zlib ์คํธ๋ฆผ์ด ํด์ ๋๋ค. ํ์ผ ๋๋ถ๋ถ(์คํ์
4845 ์ดํ)์ ์์ ํ ๋ค๋ฅธ ์ฒญํฌ์
์ํ๋๋ฐ, ๊ฑฐ๊ธฐ ์๋ ์์ถ ๋ฐ์ดํฐ๊ฐ ์ ์ ํด์ ๋๊ณ ํฌ๊ธฐ๊น์ง
179 ร (1 + 439ร4)๋ก ๋ฑ ๋ง๋๋ค. ์์ชฝ๋ง ๋ง๊ณ ๋ค๊ฐ ํ๋ฆฐ ์ํฉ์ด์๋ค๋ฉด ์ฌ๊ธฐ์ ๋ฐ๋์ ๊ฑธ๋ฆฐ๋ค.
์ธ ๋ฒ์งธ๊ฐ ํนํ ์ค์ํ๋ค. ์ฝ์ง ๋๋ 1๋ฒ๊ณผ 2๋ฒ์ด ๋ถ๋ถ์ ์ผ๋ก ํต๊ณผํด์ ์์๋๋ฐ, ํ์ผ ๋์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒ์ฆ๋๋ ์งํ๋ฅผ ํ๋ ์ก์ ๋๋ฉด ๊ทธ๋ฐ ์ฐฉ๊ฐ์ ๊ฑธ๋ฌ๋ผ ์ ์๋ค.
5. ํ์ผ ํ๋์ ๋ท์ด ๋ค์ด ์์๋ค
file์ด JPEG ์ด๋ผ๊ณ ํด์ ํ์ผ ์ ์ฒด๊ฐ JPEG ์ธ ๊ฑด ์๋๋ค. 7,415๋ฐ์ดํธ ์ค ์ด ๊ทธ๋ฆผ์ด ๋ช ๋ฐ์ดํธ๋ฅผ
์ฐ๋์ง ํ์ธํด ๋ด์ผ ํ๋ค. ๋ง์ปค๋ฅผ ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์งฐ๋ค.
d = Path("decrypted.jpg").read_bytes()
NAMES = {0xD8: "SOI", 0xD9: "EOI", 0xDA: "SOS", 0xC0: "SOF0",
0xC4: "DHT", 0xDB: "DQT", 0xE0: "APP0"}
i = 0
while i < len(d) - 1:
if d[i] == 0xFF and d[i + 1] in NAMES:
m = d[i + 1]
ln = int.from_bytes(d[i + 2:i + 4], "big")
print(f" @{i:<6} FF{m:02X} {NAMES[m]:<5} len={ln}")
i += 1
EOI(FFD9)๊ฐ ๋ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ 4845 ์ PNG ์๊ทธ๋์ฒ๊ฐ ์๋ค. ํ์ผ์ ์ด๋ ๊ฒ ์๊ฒผ๋ค.
| ๋ฒ์ | ๋ด์ฉ |
|---|---|
0 ~ 3272 | JPEG โ โ 303ร64, ๋ฉ๋ด๋ฐ. SOI ๋ถํฐ EOI ๊น์ง ์จ์ ํ๋ค |
3273 ~ 4807 | SOI ๋ ํค๋๋ ์์ด ์ค์บ ๋ฐ์ดํฐ๋ง ์๊ณ EOI ๋ก ๋๋๋ค |
4808 ~ 4844 | 37๋ฐ์ดํธ, JPEG ๋ PNG ๋ ์๋๋ค |
4845 ~ 7414 | PNG โ 439ร179 |
๋ ๋ฒ์งธ ๋ฉ์ด๋ฆฌ๊ฐ ์ค๋ช ์ ๋์จ "์๋ชป์์ฑ๋ ํ์ผ"์ด๋ค. JPEG ์ SOIยท์์ํํ(DQT)ยทํ๋ ์ ํค๋(SOF0)ยท ํํ๋งํ(DHT)ยท์ค์บ ์์(SOS)์ด ์์ด์ผ ๋์ฝ๋ฉ๋๋๋ฐ, ๊ทธ๊ฒ ํต์งธ๋ก ์๊ณ ์์ถ๋ ํฝ์ ๋ฐ์ดํฐ๋ง ๋จ์ ์๋ค.
6. ํค๋ ์๋ JPEG ์ ๋์ด๋ฆฌ๊ธฐ
์๋ ํค๋๋ ๋ง๋ค์ด ๋ถ์ด๋ฉด ๋๋ค. ๋ง์นจ ๊ฐ์ ์ธ์ฝ๋๊ฐ ๋ง๋ JPEG โ ์ด ๋ฐ๋ก ์์ ์๋ค. ์์ํํ์ ํํ๋งํ๊ฐ ๊ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ โ ์ ํค๋๋ฅผ ๊ทธ๋๋ก ์ด์ํด ๋ณธ๋ค.
JPEG โ ์์ SOS ์ธ๊ทธ๋จผํธ๊ฐ ๋๋๋ ์ง์ (609 + 2 + 12 = 623)๊น์ง๊ฐ ํค๋๋ค.
d = Path("decrypted.jpg").read_bytes()
hdr = d[0:623] # JPEGโ ์ SOI ~ SOS ์ธ๊ทธ๋จผํธ ๋
scan = d[3273:4808] # JPEGโก ์ ์ค์บ ๋ฐ์ดํฐ + EOI
Path("part2_graft.jpg").write_bytes(hdr + scan)ํฌ๊ธฐ(SOF0 ์ ๊ฐ๋กยท์ธ๋ก)๋ โ ์ 303ร64 ๊ทธ๋๋ก๋ค. ๋น์ฐํ ํ๋ ธ์ ํ ๋ฐ, JPEG ์ ํฌ๊ธฐ๊ฐ ์ด๊ธ๋๋ ๋์ฝ๋๊ฐ ์๋ ๋ฐ๊น์ง๋ ๊ทธ๋ ค ์ค๋ค.

๋์๋ค. ํ๋ฉด์ด ์ด๊ธ๋ ๊ฑด ๊ฐ๋ก ํฌ๊ธฐ๊ฐ ์ค์ ์ ๋ฌ๋ผ์ ์ค์ด ๋ฐ๋ฆฐ ๊ฒ๋ฟ์ด๊ณ , ๊ธ์๋ ์ฝํ๋ค.
์ ๋๋ก ๋ ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ํ๋ณด๋ฅผ ํ์ด ํ ์ฅ์ ๋ชจ์ ๋ดค๋ค.

์ด๋ ํญ์ผ๋ก ๋ง์ถฐ๋ DH{How ๋ค๋ ํ์์ด๋ค. ์ค์บ ๋ฐ์ดํฐ๊ฐ ๋ฑ ๊ฑฐ๊ธฐ๊น์ง๋ผ๋ ๋ป์ด๋, ์ด ๊ทธ๋ฆผ์ด
๊ฐ์ง ๊ธ์๋ ๊ทธ๊ฒ ์ ๋ถ๋ค. ํ๋ํด์ ์ ํํ ์ฝ๋๋ค.

DH{HOW๊ฐ ์๋๋ผ DH{How ๋ค. ์๊ฒ ๋ณผ ๋๋ ์ ๋ถ ๋๋ฌธ์๋ก ๋ณด์๋๋ฐ ํ๋ํ๋ ow๊ฐ ์๋ฌธ์๋ค.
ํ๋๊ทธ๋ ๋์๋ฌธ์๋ฅผ ํ๋ฆฌ๋ฉด ๊ทธ๋ฅ ์ค๋ต์ด๋ ์ด๋ฐ ๊ฑด ๊ผญ ํ๋ํด์ ํ์ธํด์ผ ํ๋ค.
7. ์ฌ์ด์ ๋ 37๋ฐ์ดํธ
JPEG โก์ EOI ์ PNG ์๊ทธ๋์ฒ ์ฌ์ด 37๋ฐ์ดํธ๊ฐ ๋จ์ ์๋ค. ๊ทธ๋ฅ ๋คํํด ๋ณธ๋ค.

Find\0the\0String\0"_ENc_ECrypt"\0\0\0...๋๋ก ๋๊ธด ํ๋ฌธ์ด๋ค. _ENc_ECrypt โ ๋ ๋ฒ์งธ ์กฐ๊ฐ์ด๊ณ , ๋ฌธ์ ์ค๋ช
์ DH{JPG_TXT_PNG} ์์
TXT ์๋ฆฌ๋ค. ์ฌ๊ธฐ์ ๊ทธ ์ค์ด ํ์ ์์๊ฐ ์๋๋ผ ์กฐ๊ฐ ์ถ์ฒ ์๋ด์๋ค๋ ๊ฑธ ์์๋ค.
8. ์ ์ด๋ฆฌ๋ PNG
๋จ์ ๊ฑด PNG ๋ค. file์ 439ร179 RGBA ๋ผ๊ณ ์ ์ฝ๋๋ฐ ์ ์ ์ด๋ฏธ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ชป ์ฐ๋ค.
์ฒญํฌ๋ฅผ ์ํํ๋ฉฐ CRC ๋ฅผ ๊ฒ์ฌํด ๋ณธ๋ค.
off = 8
while off + 8 <= len(d):
ln, typ = struct.unpack(">I4s", d[off:off + 8])
data = d[off + 8:off + 8 + ln]
crc = d[off + 8 + ln:off + 12 + ln]
ok = struct.pack(">I", zlib.crc32(typ + data) & 0xFFFFFFFF) == crc
print(f" @{off:<6} {typ.decode():<5} len={ln:<12} CRC {'OK' if ok else '*** ๋ถ์ผ์น'}")
off += 12 + ln
IHDRยทsRGBยทgAMA๊น์ง๋ CRC ๊ฐ ๋ง๋๋ค. pHYs๋ถํฐ ์ด๊ธ๋๊ณ , ๊ทธ ๋ค์ IDAT์ ๊ธธ์ด ํ๋๊ฐ
1,601,793,917๋ก ์ฝํ๋ค. ํ์ผ์ด 2,570๋ฐ์ดํธ์ธ๋ฐ 16์ต์ด๋ผ๋ ๋ง์ด ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ ๊ฐ๋๊ฐ ์๋ค. "PNG ๋ฅผ ๊ณ ์ณ์ ๊ทธ๋ฆผ์ ๋ณธ๋ค"์ "์ ์ ์ซ์๊ฐ ๋์๋์ง ๋ณธ๋ค"๋ค. ๋ ๋ค ํด ๋ดค๋๋ฐ ์ ๋ต์ ํ์์๋ค.
8-1. ๊ณ ์ณ์ ๋ณด๊ธฐ
๋ฐฐ์น ์์ฒด๋ ๋ฉ์ฉกํ๋ค. IEND๊ฐ 2562 ์ ์ ๋๋ก ์์ผ๋ IDAT ๋ฐ์ดํฐ๋ [91:2554]์ผ ์๋ฐ์ ์๋ค.
๊ธธ์ด์ CRC ๋ง ๋ค์ ๊ณ์ฐํ๋ฉด ์ด์๋๋ค.
idat = d[91:2554] # IDAT ํ์
(87)+4 ~ IEND ๊ธธ์ดํ๋(2558)-4
raw = zlib.decompress(idat) # 314,503 bytes
assert len(raw) == 179 * (1 + 439 * 4) # ๋์ด ร (ํํฐ๋ฐ์ดํธ 1 + ๊ฐ๋ก ร RGBA)zlib ํด์ ํฌ๊ธฐ๊ฐ 179 ร (1 + 439ร4) = 314,503๊ณผ ์ ํํ ๋ง๋๋ค. IHDR ์ด ๋งํ ํฌ๊ธฐ๊ฐ
์ง์ง๋ผ๋ ๋ป์ด๊ณ , ๋ฐ์ดํฐ๋ ์จ์ ํ๋ค๋ ๋ป์ด๋ค. ์ฒญํฌ๋ฅผ ๋ค์ ์กฐ๋ฆฝํ๋ฉด ์ด๋ฆฐ๋ค.

๊ทธ๋ฐ๋ฐ ๋ฐฑ์ง๋ค. ๋ฉ๋ด๋ฐ ์๋ ํฝ์
์ ์ ๋ถ ์ธ์ด ๋ณด๋ฉด #ffffff ํ ์๋ฟ์ด๋ค. ๊ทธ๋ฆด ๊ธ์๊ฐ
์ ์ด์ ์์๋ค. ์ค๋ช
์ "๋ฌธ์ ํ์ผ์ด ํ๋ ์๋ชป์์ฑ ๋์์ต๋๋ค"๊ฐ ์ด๊ฑธ ๋งํ ๊ฑฐ์๋ค.
8-2. ์ 16์ต์ด ๋์๋์ง ๋ณด๊ธฐ
๊ทธ๋ผ ๊ทธ ์ด์ํ ๊ธธ์ด ํ๋๋ ๋ญ๊น. ๋ฐ์ดํธ๋ฅผ ๊ทธ๋๋ก ๋ณด๋ฉด 5f 79 6f 7d ๋ค. ASCII ๋ก ์ฝ์ผ๋ฉด
_yo} ๋ค. ํน์ ๋ชฐ๋ผ ํ์ผ ์ ์ฒด์์ ASCII ๋ฐ์ ํ์๋ค.
for m in re.finditer(rb"[\x20-\x7e]{6,}", d):
print(f" @{m.start():<6} {m.group().decode()!r}")
@4928 '_yo}IDATx^'. ํ๋๊ทธ ์กฐ๊ฐ์ด IDAT ์ฒญํฌ์ ๊ธธ์ด ํ๋ ์๋ฆฌ์ ๊ทธ๋๋ก ๋ฎ์ฌ ์์๋ค.
๊ทธ๋ฆผ์ ๊ธ์๋ฅผ ๊ทธ๋ฆฌ๋ ๋์ ํ์ผ ๊ตฌ์กฐ๋ฅผ ๋ฎ์ด์ด ๊ฒ์ด๊ณ , ๊ทธ๋์ PNG ๊ฐ ์ ์ด๋ฆฌ๊ณ ๋ด์ฉ๋ ๋ฐฑ์ง์๋ค.
"์๋ชป์์ฑ"๊ณผ "๋ง์ง๋ง ์ฌ์ง ํ๋๊ทธ ๊ธ์์๋ 4๊ฐ"๊ฐ ์ฌ๊ธฐ์ ๋์์ ๋ง์๋จ์ด์ง๋ค โ _yo} ๋ ์ ํํ 4๊ธ์๋ค.
PNG ๋ฅผ ๊ณ ์ณ์ ๊ทธ๋ฆผ๋ง ๋ดค๋ค๋ฉด ๋ฐฑ์ง๋ฅผ ๋ณด๊ณ ๋งํ์ ๊ฒ์ด๋ค. ๊นจ์ง ๊ตฌ์กฐ ํ๋ ์์ฒด๊ฐ ๋ฐ์ดํฐ์ผ ์ ์๋ค๋ ๊ฒ ์ด ๋ฌธ์ ์ ์ง์ง ๊ตํ์ด๋ผ๊ณ ์๊ฐํ๋ค.
9. ์กฐ๊ฐ ๋ง์ถ๊ธฐ
p1 = "DH{How" # JPEGโก ์ ๊ทธ๋ ค์ง ํ
์คํธ (JPEGโ ํค๋๋ฅผ ์ด์ํด ๋ ๋)
p2 = "_ENc_ECrypt" # JPEGโก EOI ์ PNG ์ฌ์ด ํ๋ฌธ 37๋ฐ์ดํธ
p3 = "_yo}" # PNG ์ IDAT ๊ธธ์ด ํ๋ ์๋ฆฌ์ ๋ฎ์ฌ ์๋ 4๊ธ์
print("FLAG =", p1 + p2 + p3)
DH{How_ENc_ECrypt_yo}์ค๋ช
์ด ์ค DH{JPG_TXT_PNG} ๊ตฌ์กฐ์ ์ ํํ ๋์ํ๋ค.
| ์ถ์ฒ | ์กฐ๊ฐ | ์ด๋ป๊ฒ ๊บผ๋๋ |
|---|---|---|
| JPG (JPEG โก) | DH{How | ํค๋๊ฐ ์์ด JPEG โ ์ SOI~SOS ๋ฅผ ์ด์ํด ๋ ๋ |
| TXT (ํ๋ฌธ 37B) | _ENc_ECrypt | ๋ ์ด๋ฏธ์ง ์ฌ์ด์ ๋ ๊ตฌ๋ถ ๋ฌธ์์ด๋ก ๋ฐํ ์์ |
| PNG | _yo} | IDAT ๊ธธ์ด ํ๋ ์๋ฆฌ์ ๋ฎ์ฌ ์์ (๊ทธ๋์ ํ์ผ์ด ์ ์ด๋ฆผ) |
10. ๋ฐฉ์ด ๊ด์ ์์
๋ฌธ์ ๋ฅผ ๋ ๋ ์ค๋ฌด๋ก ์ฎ๊ฒจ ๋๊ณ ๋ณด๋ฉด ๋ช ๊ฐ์ง๊ฐ ๋จ๋๋ค.
ํ๋์ฝ๋ฉ ํค๋ ํค๊ฐ ์๋๋ค. funfun์ .rdata ์ ํ๋ฌธ์ผ๋ก ์์๊ณ strings ํ ๋ฒ์ ๋์๋ค.
์คํํ์ผ ์์ ์๋ ๊ฐ์ ์ฌ์ฉ์์๊ฒ ์๋ ๊ฐ์ด๋ค. ์ฌ๊ธฐ์ ๋ํด ์ด ๊ตฌํ์ ํค 6๋ฐ์ดํธ ์ค 3๋ฐ์ดํธ๋ฅผ
์ค์ ๋ก๋ ์ฐ์ง๋ ์์๋ค โ i & 6 ๋๋ฌธ์ ์ ํจ ํค ๊ณต๊ฐ์ด ์ฌ์ค์ 3๋ฐ์ดํธ๋ก ์ค์๋ค.
์ง์ ๋ง๋ RC4 ๋ณํ์ RC4 ๋ณด๋ค ์ฝํ๋ค. %๋ฅผ &๋ก ๋ฐ๊พธ๊ณ ์ธ๋ฑ์ฑ์ ํ ๋ฒ ๋ ํ๋ ์์ ์์ ์
์์ ์ฑ์ ๋์ด์ง ์๋๋ค. ์คํ๋ ค ์ด ๊ฒฝ์ฐ์ ์ฒญํฌ๋ง๋ค ์ํ๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ๋์ ๊ฐ์ ํค์คํธ๋ฆผ ํจํด์ด
1024๋ฐ์ดํธ๋ง๋ค ๋ฐ๋ณต๋๋ ๊ตฌ์กฐ๊ฐ ๋๋ค. ์๋ ค์ง ํ๋ฌธ(JPEG ํค๋ ff d8 ff e0)์ด ์์ผ๋ฉด ํค๋ฅผ ๋ชฐ๋ผ๋
๊ณต๊ฒฉํ ์ฌ์ง๊ฐ ์๊ธด๋ค.
XOR ๋ง์ผ๋ก๋ ๋ฌด๊ฒฐ์ฑ์ด ์๋ค. ๋ณตํธ ๊ฒฐ๊ณผ๊ฐ ๋ง๋์ง ํ๋ฆฐ์ง ํ๋ก๊ทธ๋จ์ ์ ์ ์๋ค. ์ค์ ๋ก ๋๋ ์๋ชป๋ ๋ณตํธ๋ณธ์ผ๋ก๋ "์ ์ JPEG"์ ์ป์๋ค(ํค๋ 1024๋ฐ์ดํธ๊ฐ ๋ง์์ผ๋๊น). ์ํธํํ ๋ฐ์ดํฐ์๋ MAC ์ด๋ AEAD ๋ฅผ ๋ถ์ฌ์ผ ์ด๋ฐ ์ํฉ์์ ์ฆ์ ๊ฑธ๋ฌ์ง๋ค.
ํฌ๋ ์ ์ชฝ์ผ๋ก๋, ํ์ฅ์์ file ์ถ๋ ฅ์ ํ์ผ์ ์๋ถ๋ถ๋ง ๋ณธ๋ค๋ ๊ฑธ ๊ธฐ์ตํด ๋ ๋งํ๋ค.
์ด๋ฒ์ฒ๋ผ ํ ํ์ผ์ ๋ค ๋ฉ์ด๋ฆฌ๊ฐ ์ด์ด๋ถ์ด ์์ด๋ file์ "JPEG"์ด๋ผ๊ณ ๋ง ํ๋ค. EOI ์ดํ๋ฅผ ํ์ธํ๋
์ต๊ด, ๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐ ํ๋์ ๊ฐ์ด ๋น์์์ ์ด๋ฉด ๊ทธ๊ฒ ์ค์ผ์ด ์๋๋ผ ๋ฐ์ดํฐ์ผ ์ ์๋ค๋ ์๊ฐ์ด
์ด ๋ฌธ์ ์ ๋ง์ง๋ง ๊ด๋ฌธ์ด์๋ค.
์ ๋ฆฌ
Enc.exe๋flag.jpg๋ฅผ ๋ ๋ฒ ๋ฎ์ด์ด๋ค. 1๋จ๊ณ๋ RC4 ๋ณํ, 2๋จ๊ณ๋ ์ธ๋ฑ์ค ํ์ง XOR- RC4 ๋ณํ์ ํจ์ ์
:
key[i & 6], ํค์คํธ๋ฆผS[S[t]], 0x400 ์ฒญํฌ๋ง๋ค S ๋ฐ์ค ์ฌ์์ฑ - ์ ์งธ๋ฅผ ๋์น๋ฉด ์ 1024๋ฐ์ดํธ๋ง ๋ณตํธ๋ผ "ํค๋๋ ๋ง๋๋ฐ ๊ทธ๋ฆผ์ด ๊นจ์ง" ์ํ๊ฐ ๋๋ค
- ๋ณตํธ๋ณธ์ JPEG + ํค๋ ์๋ JPEG + ํ๋ฌธ 37B + PNG ๊ฐ ์ด์ด๋ถ์ ํ ํ์ผ
- ํ๋๊ทธ ์ธ ์กฐ๊ฐ ์ค ๋ง์ง๋ง์ PNG ์ IDAT ๊ธธ์ด ํ๋ ์๋ฆฌ์ ์์ด ๊ทธ๋ฆผ์ผ๋ก๋ ์ ๋ณด์ธ๋ค
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ