๋ฌธ์ : DreamHack โ VBR ๋ถ๋ฅ: Forensics ๋์ด๋: ๐ฅ Bronze 2 FLAG:
DH{2343104139}
512๋ฐ์ดํธ์ง๋ฆฌ VBR(Volume Boot Record) ํ์ผ ํ๋๊ฐ ์ฃผ์ด์ง๋ค. ํ๋๊ทธ๊ฐ ๋ฌธ์์ด๋ก ๋ฐํ ์์ง ์๋ค. ๋์ ๋ฌธ์ ๋ ๋ถํธ์นํฐ์ ํน์ ํ๋๋ค์ ์ฝ์ด ์ง์ ๊ณ์ฐํ๋ผ๊ณ ํ๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | VBR |
| ๋์ด๋ | ๐ฅ Bronze 2 |
| ๋ถ๋ฅ | Forensics |
| ์ ๊ณต ํ์ผ | vbr.bin (512๋ฐ์ดํธ FAT32 ๋ถํธ์นํฐ) |
| ๊ณ์ฐ์ | FLAG = DH{(A + B + C)} (์ญ์ง์) |
๋ฌธ์ ๊ฐ ์ ์ํ๋ ์ธ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
- A: ํ์ผ์์คํ
์ด FAT32๋ฉด
1, NTFS๋ฉด2 - B: ํด๋น ๋ณผ๋ฅจ์ ํฌ๊ธฐ
- C: ๋ณผ๋ฅจ ์๋ฆฌ์ผ ๋ฒํธ
๐งฑ ๋ฐฐ๊ฒฝ โ VBR ๊ณผ FAT32 ๋ถํธ์นํฐ
VBR(Volume Boot Record)์ ํํฐ์ (๋ณผ๋ฅจ)์ ์ฒซ ๋ฒ์งธ ์นํฐ๋ก, ๋ถํ ์ฝ๋์ ํจ๊ป BPB(BIOS Parameter Block) ๋ฅผ ๋ด๋๋ค. BPB์๋ ์นํฐ ํฌ๊ธฐ, ํด๋ฌ์คํฐ๋น ์นํฐ ์, ์ด ์นํฐ ์, ํ์ผ์์คํ ์ข ๋ฅ, ๋ณผ๋ฅจ ์๋ฆฌ์ผ ๊ฐ์ ๋ณผ๋ฅจ์ ๊ธฐํํ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๊ณ ์ ์คํ์ ์ ๋ค์ด ์๋ค. ํฌ๋ ์์์ ๋์คํฌ ์ด๋ฏธ์ง๋ฅผ ํด์ํ ๋ ๊ฐ์ฅ ๋จผ์ ์ฝ๋ ๊ตฌ์กฐ๋ค.

์ถ์ฒ: Wikimedia Commons (File:Fat32_structure.svg), CC BY-SA 3.0, ์ ์์ MrDrBob. ์ ๊ทธ๋ฆผ์ ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ์ FAT ์ฒด์ธ์ด๊ณ , VBR์ ๋ณผ๋ฅจ ๋งจ ์์ ๋์ด๋ ๋ถํธ์นํฐ๋ค.
์ฐ๋ฆฌ๊ฐ ์ฝ์ ํ๋์ ์คํ์ ์ FAT32 ๊ท๊ฒฉ์ ๊ณ ์ ๋ผ ์๋ค.
| ์คํ์ | ํฌ๊ธฐ | ํ๋ |
|---|---|---|
0x0B | 2 | Bytes per Sector (์นํฐ๋น ๋ฐ์ดํธ) |
0x20 | 4 | Total Sectors (์ด ์นํฐ ์, 32๋นํธ) |
0x43 | 4 | Volume Serial Number (๋ณผ๋ฅจ ์๋ฆฌ์ผ) |
0x52 | 8 | File System Type ("FAT32 ") |
๐ฌ ์ ์ฐฐ โ ํฅ์ค๋คํ๋ก ํ๋ ํ์ธ
vbr.bin์ ํฅ์ค๋ก ์ด๋ฉด ํ์ค Windows FAT32 ๋ถํธ์นํฐ์์ด ๋ฐ๋ก ๋ณด์ธ๋ค. MSDOS5.0 OEM ์ด๋ฆ, NO NAME, FAT32, BOOTMGR ๋ฌธ์์ด์ด ๊ทธ๋๋ก ์๋ค.
xxd -l 80 vbr.bin
๊ฐ ํ๋๋ฅผ ๋ฆฌํ ์๋์ธ์ผ๋ก ์ฝ๋๋ค.
0x0B:00 02โ0x0200= 512 (์นํฐ๋น ๋ฐ์ดํธ)0x20:00 80 3E 00โ0x003E8000= 4096000 (์ด ์นํฐ ์)0x43:8A EE A8 0Eโ0x0EA8EE8A= 245952138 (๋ณผ๋ฅจ ์๋ฆฌ์ผ)0x52:FAT32โ ํ์ผ์์คํ ์ FAT32
โ ๏ธ ์ฐธ๊ณ ๋ก
0x120๋ถ๊ทผ์ ๋ณด์ด๋66 58 66 58 โฆ("fXfXfXfX")์ ํ๋๊ทธ์ฒ๋ผ ์๊ฒผ์ง๋ง ํจ์ ์ด๋ค.66 58์ x86 ๋ช ๋ นpop eax(operand-size prefix +58)๋ก, ์คํ์ ์ ๋ฆฌํ๋ ์ ์ ๋ถํธ ์ฝ๋์ผ ๋ฟ์ด๋ค.
๐ฃ ํต์ฌ โ "๋ณผ๋ฅจ์ ํฌ๊ธฐ" ๋ ๋ฐ์ดํธ ๋จ์
๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๊ฐ์ B(๋ณผ๋ฅจ ํฌ๊ธฐ) ๋ค. ์ด ์นํฐ ์ ์์ฒด๋ฅผ ์ฐ๋์ง, ๋ฐ์ดํธ๋ก ํ์ฐํ๋์ง ์ ๋งคํ๋ค. "ํฌ๊ธฐ(size)"๋ผ๋ ํํ์ ๋ฐ์ดํธ๋ฅผ ๋ปํ๋ฏ๋ก,
B = ์ด ์นํฐ ์ ร ์นํฐ๋น ๋ฐ์ดํธ
= 4096000 ร 512
= 2097152000 (= 0x7D000000)๋ก ๊ณ์ฐํ๋ค. ๋๋จธ์ง๋ ์ ์ ๊ทธ๋๋ก๋ค. A = 1(FAT32), C = 0x0EA8EE8A = 245952138. ์ธ ๊ฐ์ ์ญ์ง์๋ก ๋ํ๋ค.
A + B + C = 1 + 2097152000 + 245952138 = 2343104139๐ฏ ํ์ด โ ํ๋๋ฅผ ํ์ฑํด ํฉ์ฐ
# solve.py
import struct
d = open("vbr.bin", "rb").read()
bps = struct.unpack_from("<H", d, 0x0b)[0] # bytes per sector
sectors = struct.unpack_from("<I", d, 0x20)[0] # total sectors (32bit)
serial = struct.unpack_from("<I", d, 0x43)[0] # volume serial number
A = 1 # FAT32 -> 1
B = sectors * bps # ๋ณผ๋ฅจ ํฌ๊ธฐ (๋ฐ์ดํธ)
C = serial
print(f"A(FAT32)=1 B(size)={B} (0x{B:x}) C(serial)=0x{serial:x}={serial}")
print(f"FLAG: DH{{{A + B + C}}}")
์ธ ๊ฐ์ ๋ํ๋ฉด 2343104139, ์ด๊ฒ์ด ํ๋๊ทธ์ ๋ด์ฉ์ด๋ค.
FLAG: DH{2343104139}
๐ ๊ฒฐ๋ก
ํฌ๋ ์์ ๋ต์ ํ์ผ ์์ด ์๋๋ผ ๊ตฌ์กฐ ์์ ์๋ค.
์ด ๋ฌธ์ ์ ํ๋๊ทธ๋ ์ด๋์๋ ๋ฌธ์์ด๋ก ์ ํ ์์ง ์๋ค. ๋ถํธ์นํฐ์ ๊ณ ์ ์คํ์ ์์ ๊ฐ์ ์ฝ์ด ๊ณ์ฐํด์ผ ๋์จ๋ค. ํ์ผ์์คํ ๊ตฌ์กฐ๋ฅผ ์๊ณ , ํ๋๊ฐ ์ด๋์ ์ด๋ค ์๋์ธ์ผ๋ก ๋ค์ด ์๋์ง ์๋ ๊ฒ์ด ๊ณง ์ค๋ ฅ์ด๋ค.
"๊ทธ๋ด๋ฏํ ํจ์ "์ ์์ง ๋ง ๊ฒ.
fXfXfXfX์ฒ๋ผ ํ๋๊ทธ๋ฅผ ํ๋ด ๋ธ ๋ฐ์ดํธ ํจํด์ ์ฌ์ค ์ ์ ๋ถํธ ์ฝ๋์๋ค. ํฅ์ค์์ ๋์ ๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐ๊ฒฌํ์ ๋, ๊ทธ๊ฒ ๋ฐ์ดํฐ์ธ์ง ์ฝ๋์ธ์ง ๊ตฌ๋ถํ๋ ค๋ฉด ๋ฌธ๋งฅ(์ฌ๊ธฐ์๋ x86 ๋์ค์ด์
๋ธ)์ ํ์ธํด์ผ ํ๋ค. ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ํจ์ ๊ณผ ์ ๋ต์ด ๋ช
ํํ ๊ฐ๋ฆฐ๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ