๋ฌธ์ : DreamHack โ Hefty Image ๋ถ๋ฅ: Forensics ๋์ด๋: ๐ฅ Bronze 4 FLAG:
DH{s1mpl3_st3g4n0gr4phy_w1th_c0nc4t}
๋ฌธ์ ์ค๋ช ์ ์ด๋ ๋ค. "์น๊ตฌ๊ฐ ์ฌํ ์ค์ ์ฐ์ ์ฌ์ง์ด๋ผ๋ฉฐ ํ์ผ์ ํ๋ ๋ณด๋ด์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ํ๋ฒํ ์ฌ์ง ํ์ผ์น๊ณ ๋ ์ฉ๋์ด ์กฐ๊ธ ๋ฌต์งํ๋ค์." ๊ทธ๋ฆผ ํ์ผ ํ๋๋ฅผ ์ฃผ๋ ํฌ๋ ์ ๋ฌธ์ ์ธ๋ฐ, ์ด์ด ๋ณด๋ฉด ํ๋ฒํ ์ด๋ฏธ์ง์ง๋ง ํ์ผ์ด ํ๋ฉด์ ๋ณด์ด๋ ๊ฒ๋ณด๋ค "๋ฌด๊ฒ๋ค(hefty)". JPEG๊ฐ ๋๋ ๋ค์ ZIP์ด ๋ชฐ๋ ์ด์ด ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋๊ตฌ๋ํ๊ต๊ฐ ์ถ์ ํ ๋ฌธ์ ๋ก, ๋ํ ์๊ฒ์ ์๊ฐ ์บ๋ฆญํฐ ๊ณ์ ์ผ๋ก ๋ฑ๋ก๋ผ ์๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | Hefty Image |
| ๋์ด๋ | ๐ฅ Bronze 4 |
| ๋ถ๋ฅ | Forensics |
| ์ ๊ณต ํ์ผ | challenge.jpg (5,356๋ฐ์ดํธ, 500ร500 JPEG) |
| ํต์ฌ ๊ธฐ๋ฒ | JPEG ๋ค์ ZIP์ ์ด์ด ๋ถ์ธ ์ฐ๊ฒฐ(concat) ์คํ ๊ฐ๋ ธ๊ทธ๋ํผ |
ํ์ผ ํ๋๋ง ์์ผ๋ฉด ์คํ๋ผ์ธ์์ ๋ฐ๋ก ํ๋ฆฐ๋ค.
๐ฌ ์ ์ฐฐ โ ๊ทธ๋ฆผ์ธ๋ฐ ์์ถํ์ผ์ด ์ด๋ฆฐ๋ค
file๋ก ๋ณด๋ฉด ๋ถ๋ช
JPEG์ธ๋ฐ, ๊ทธ ํ์ผ์ unzip์ผ๋ก ์ด์ด ๋ณด๋ฉด ๋ชฉ๋ก์ด ๋์จ๋ค.
file challenge.jpg
unzip -l challenge.jpg
file์ JPEG image data, 500ร500์ด๋ผ๊ณ ํ์ง๋ง, unzip -l challenge.jpg๋ "5206 extra bytes at beginning or within zipfile"์ด๋ผ๋ ๊ฒฝ๊ณ ๋ฅผ ๋์ฐ๋ฉด์๋ ๊ทธ ํ์ผ ์์์ flag.txt(36๋ฐ์ดํธ)๋ฅผ ๋ชฉ๋ก์ผ๋ก ์ฐพ์๋ธ๋ค. ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ์์ฒด๊ฐ ํํธ๋ค โ unzip์ด ํ์ผ ์์ชฝ 5206๋ฐ์ดํธ๋ฅผ "์ธ๋ชจ์๋ ๋ค"์ผ๋ก ์ธ์ํ๊ณ ๊ฑด๋๋ฐ์๋ค๋ ๋ป์ด๋ค. ํ ํ์ผ์ด ์ด๋ฏธ์ง์ด๋ฉด์ ๋์์ ์ ํจํ ZIP์ธ ๊ฒ์ด๋ค.
๋จผ์ ํํ ๋๊ตฌ์ธ binwalk๋ก ์๋ฒ ๋๋ ์๊ทธ๋์ฒ๋ฅผ ํ์ด๋ณด๋ ค ํ๋ค.
binwalk challenge.jpg
์ด ํ๊ฒฝ์ ์ค์น๋ binwalk(2.4.3)๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฐธ์กฐํ๋ capstone.CS_ARCH_ARM64๊ฐ ์ต์ capstone ํจํค์ง(6.0.0 ์ํ)์์ ์ฌ๋ผ์ ธ ์ํฌํธ ๋จ๊ณ๋ถํฐ ์ฃฝ๋๋ค. ๋์ค์ด์
๋ธ ๊ธฐ๋ฅ์ ์ฐ์ง ์์๋ ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ์๊ฐ ์คํจํ๊ธฐ ๋๋ฌธ์ ์ต์
์ผ๋ก ์ฐํํ ์๋ ์๋ค. ์ด์ฐจํผ unzip -l์ด ์ด๋ฏธ ๋ต์ ๋ณด์ฌ์คฌ์ผ๋, ๊ตณ์ด ๋ถ์ก์ง ์๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
๐ฃ ํต์ฌ โ ๋์์ ์ฝ๋ ZIP, ์์์ ๋ฉ์ถ๋ ๋ทฐ์ด
JPEG๋ FF D8๋ก ์์ํด FF D9(EOI, End Of Image)๋ก ๋๋๋ค. ์ด๋ฏธ์ง ๋ทฐ์ด๋ FF D9๋ฅผ ๋ง๋๋ฉด ๊ฑฐ๊ธฐ์ ๋ ๋๋ง์ ๋ฉ์ถ๊ณ , ๊ทธ ๋ค์ ๋ฌด์์ด ์๋ ๋ฌด์ํ๋ค. ๊ทธ๋์ ๋ค์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌ๋ ๊ทธ๋ฆผ์ ๋ฉ์ฉกํ ๋ณด์ธ๋ค.
๋ฐ๋๋ก ZIP์ ํ์ผ ๋์ ์๋ ์ค์ ๋๋ ํ ๋ฆฌ(central directory)๋ถํฐ ๊ฑฐ๊พธ๋ก ์ฝ๋ ๊ตฌ์กฐ๋ค. ๊ทธ๋์ ZIP ์์ ์๋ฌด ๋ฐ์ดํฐ(์ฌ๊ธฐ์๋ JPEG ์ ์ฒด)๊ฐ ๋ถ์ด ์์ด๋ unzip์ ๋์์๋ถํฐ ์ ์ ๊ตฌ์กฐ๋ฅผ ์ฐพ์ ์ด์ด ์ค๋ค.
์ด ๋์ ํฉ์น๋ฉด, [JPEG ... FF D9][ZIP ... flag.txt] ํ ํ์ผ์ด ๋ทฐ์ด์๊ฒ ๊ทธ๋ฆผ, unzip์๊ฒ ์์ถํ์ผ๋ก ๋์์ ๋์ํ๋ค. ์ค์ ๋ก ๊ฒฝ๊ณ๋ฅผ ์ง์ ์ฐพ์ ํ์ธํ๋ค.
d = open("challenge.jpg", "rb").read()
i = d.find(b"\xff\xd9")
print("์ ์ฒด ํฌ๊ธฐ:", len(d))
print("JPEG EOI(FFD9) ๋์์น:", i + 2)
print("๊ทธ ์งํ 4๋ฐ์ดํธ:", d[i + 2:i + 6])
FF D9๊ฐ ๋๋๋ 5206๋ฒ์งธ ๋ฐ์ดํธ ๋ฐ๋ก ๋ค์์ด ์ ํํ PK\x03\x04 โ ZIP ๋ก์ปฌ ํ์ผ ํค๋์ ๋งค์ง ์๊ทธ๋์ฒ๋ค. ๊ฒ๋ค๊ฐ ํฅ์ค๋คํ๋ฅผ ๋ณด๋ฉด flag.txt๋ผ๋ ํ์ผ๋ช
๋ฌธ์์ด๊ณผ, ๊ทธ ๋ค๋ก DH{s1mpl3_st3g4n0gr4phy_w1th_c0nc4t}๋ผ๋ ํ๋๊ทธ ๋ณธ๋ฌธ์ด ์ฌ๋์ด ์ฝ์ ์ ์๋ ASCII๋ก ๊ทธ๋๋ก ์ฐํ ์๋ค. unzip -lv๋ก ์์ถ ๋ฐฉ์์ ํ์ธํด๋ณด๋ฉด Stored(0% ์์ถ, ๋ฌด์์ถ ์ ์ฅ)๋ผ๊ณ ๋์ค๋๋ฐ, ๊ทธ๋์ ์์ถ์ ํ ํ์๋ ์์ด ํฅ์ค๋คํ๋ง์ผ๋ก ๋ด์ฉ์ด ๊ทธ๋๋ก ๋
ธ์ถ๋ ๊ฒ์ด๋ค โ ์์ถ(Deflate)๋ผ ์์๋ค๋ฉด ์ด๋ ๊ฒ ํ๋ฌธ์ผ๋ก ๋ณด์ด์ง ์์์ ๊ฒ์ด๋ค.

๐ฏ ํ์ด โ unzip -p
๋ชฉ๋ก์ flag.txt๊ฐ ์์ผ๋ ๊ทธ๋๋ก ๊บผ๋ด๋ฉด ๋๋ค. ์์ถ์ ํ์ด ํ์ผ์ ๋จ๊ธฐ์ง ์๊ณ ๋ด์ฉ๋ง ํ์ค์ถ๋ ฅ์ผ๋ก ๋ฝ๋๋ค.
unzip -p challenge.jpg flag.txt
flag.txt์ ๋ด์ฉ์ด ๊ทธ๋๋ก ํ๋๊ทธ๋ค. ๋ฌธ์ ์ด๋ฆ Hefty Image(๋ฌด๊ฑฐ์ด ์ด๋ฏธ์ง)์ ํ๋๊ทธ ๋ฌธ๊ตฌ(s1mpl3 st3g4n0gr4phy w1th c0nc4t, ์ฐ๊ฒฐ๋ก ๋ง๋ ๊ฐ๋จํ ์คํ
๊ฐ๋
ธ๊ทธ๋ํผ)๊ฐ ๊ทธ๋๋ก ๊ธฐ๋ฒ์ ๋งํด ์ค๋ค.
FLAG: DH{s1mpl3_st3g4n0gr4phy_w1th_c0nc4t}
๐ ๊ฒฐ๋ก
"๋ณด์ด๋ ๊ฒ"๊ณผ "ํ์ผ ์ ์ฒด"๋ ๋ค๋ฅด๋ค. ์ด๋ฏธ์ง ๋ทฐ์ด๊ฐ ๋ณด์ฌ ์ฃผ๋ ๊ฑด FF D9๊น์ง์ผ ๋ฟ, ํ์ผ์๋ ๊ทธ ๋ค๊ฐ ๋ ์์ ์ ์๋ค. ํ์ผ ํฌ๊ธฐ๊ฐ ํ๋ฉด ๋ด์ฉ์ ๋นํด ํฌ๋ฉด(hefty), ๋ค์ ๋ญ๊ฐ ์ด์ด ๋ถ์๋์ง๋ถํฐ ์์ฌํ๋ค. file์ ์๋ถ๋ถ๋ง ๋ณด๊ณ ํ๋จํ๋ ๊ทธ ๋ง๋ง ๋ฏฟ์ด์ ์ ๋๋ค.
ํฌ๋งท๋ง๋ค ์ฝ๋ ๋ฐฉํฅ์ด ๋ค๋ฅด๋ค. JPEG๋ ์์์, ZIP์ ๋ค์์ ์ฝ๋๋ค. ์ด ๋ฐฉํฅ ์ฐจ์ด ๋๋ฌธ์ ๋ ํฌ๋งท์ ํ ํ์ผ์ ๊ฒน์ณ ๋ ์ ์๋ค. ํฌ๋ ์์์ ํ์ผ์ด ์์ํ๋ฉด unzip -l, ํ์ผ ๋๋ถ๋ถ hex ๋คํ๋ก ๋ค๋ฅธ ์๊ทธ๋์ฒ(PK, FF D8, %PDF ๋ฑ)๊ฐ ์์ฌ ์๋์ง๋ถํฐ ํ๋ ์ต๊ด์ด ์ ์ฉํ๋ค โ binwalk ๊ฐ์ ์๋ํ ๋๊ตฌ๊ฐ ๋์๊ฐ๋ฉด ๊ฐ์ฅ ํธํ์ง๋ง, ์ด๋ฒ์ฒ๋ผ ๋๊ตฌ๊ฐ ๋ง์ฝ์ด์ด๋ ์๊ทธ๋์ฒ ๋ช ๊ฐ๋ง ์์ผ๋ก ์ฐพ์ผ๋ฉด ๋๊ฐ์ ๊ฒฐ๋ก ์ ๋๋ฌํ ์ ์๋ค.
์์ถ ๋ฐฉ์๋ ์ ๋ณด๋ฅผ ํ๋ฆฐ๋ค. ZIP ์์ ๋ฃ์ ๋ ์์ถ(Deflate) ๋์ ๋ฌด์์ถ(Stored)์ ์ฐ๋ฉด ํธ์ง๊ธฐ๋ ํฅ์ค๋ทฐ์ด๋ก ์ด์์ ๋ ๋ด์ฉ์ด ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค. ์ง์ง๋ก ๋ฐ์ดํฐ๋ฅผ ์จ๊ธฐ๊ณ ์ถ๋ค๋ฉด ์์ถ์ ๋ฌผ๋ก ์ด๊ณ ์ต์ํ์ ์ํธํ๋ผ๋ ๊ณ๋ค์ฌ์ผ ํ๋ค๋ ๋ฐ๋ฉด๊ต์ฌ์ด๊ธฐ๋ ํ๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ