๋ฌธ์ : DreamHack โ Simple Crack Me ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฑ ์์น (Sprout) FLAG:
DH{322376503}
๋ฌธ์ ์ค๋ช
์ด ์น์ ํ๋ค. "์ซ์๋ฅผ ๋ฐ์ ์ ํด์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ฒ์ฆํด correct ๋๋ wrong์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ"์ด๊ณ , "correct๋ฅผ ์ถ๋ ฅํ๋ 10์ง์ ์์ ๊ฐ"์ ์ฐพ์ผ๋ฉด ๊ทธ ๊ฐ์ DH{}๋ก ๊ฐ์ผ ๊ฒ ํ๋๊ทธ๋๋ค. ๋ฐ์ด๋๋ฆฌ ํ๋, ํ์ผ ํ๋, ์กฐ๊ฑด ํ๋. ๋ฆฌ๋ฒ์ฑ ์
๋ฌธ ๋ฌธ์ ๋ต๊ฒ ๋ก์ง๋ ์ ํํ ๊ทธ๋งํผ๋ง ์๋ค.
๐ฌ ์ ์ฐฐ
simple_crack_me: ELF 64-bit LSB executable, x86-64, statically linked, ... stripped
์ ์ ๋งํฌ + strip์ด๋ผ ์ฌ๋ณผ์ ์์ง๋ง, PIE๊ฐ ๊บผ์ ธ ์๋ค๋ ๊ฒ ์ค์ํ๋ค(No PIE (0x400000)). ์ฃผ์๊ฐ ์คํํ ๋๋ง๋ค ๋ฐ๋์ง ์๊ณ ๋ฐ์ด๋๋ฆฌ์ ์ ํ ๊ทธ๋๋ก ๊ณ ์ ๋๋ค๋ ๋ป์ด๋ค. ๋์ค์ด์
๋ธ์์ ๋ณธ ์ฃผ์๋ฅผ gdb์์๋, ํ์ผ ์คํ์
๊ณ์ฐ์์๋ ๊ทธ๋๋ก ๋ฏฟ๊ณ ์ธ ์ ์๋ค.
๐ฃ ํต์ฌ โ main์ ๊น๋ฉด ๋น๊ต ์์๊ฐ ๋ฐ๋ก ๋ณด์ธ๋ค
objdump -d๋ก ์ง์
์ ๊ทผ์ฒ๋ฅผ ๋ณด๋ฉด ๋ก์ง ์ ์ฒด๊ฐ 30์ค ์์ ๋ค ๋ค์ด ์๋ค. scanf๋ก ์ ์ ํ๋(%d)๋ฅผ ์ฝ๊ณ , ๊ทธ ๊ฐ์ ์์ ํ๋์ ๋น๊ตํ๊ณ , ๋ง์ผ๋ฉด puts("Correct!"), ํ๋ฆฌ๋ฉด ์
๋ ฅ๊ฐ์ %x๋ก ๋๋๋ ค์ฃผ๋ฉฐ wrong์ ์ถ๋ ฅํ๋ค.

ํต์ฌ์ ์ด ๋ ์ค์ด๋ค.
401b12: mov eax,[rbp-0xc] ; ๋ฐฉ๊ธ scanf๋ก ๋ฐ์ ์
๋ ฅ๊ฐ
401b15: cmp eax,0x13371337 ; ์ด ์์์ ๊ฐ์์ผ ํต๊ณผ
401b1a: jne 0x401b32 ; ๋ค๋ฅด๋ฉด "wrong" ๊ฒฝ๋ก๋ก ์ ํ๋ธ๋ฃจํธํฌ์ค๋, ์๊ณ ๋ฆฌ์ฆ ์ญ์ฐ๋ ํ์ ์๋ค. ๋น๊ต ๋์ ์์๊ฐ ๋ช
๋ น์ด ์ธ์ฝ๋ฉ ์์ ๊ทธ๋๋ก ๋ฆฌํฐ๋ด๋ก ๋ฐํ ์๋ค. cmp eax, imm32๋ ์คํผ๋๋๊ฐ ์ฝ๋ ์์ฒด์ ์๊ฒจ์ง๋ ๋ช
๋ น์ด๋ผ, ์๋ฌด๋ฆฌ ์ฌ๋ณผ์ ์ง์ฐ๊ณ ์ ์ ๋งํฌ๋ก ๋ญ์ณ๋๋ ์ด ๋ฆฌํฐ๋ด ๊ฐ๋ง์ ์จ๊ธธ ์๊ฐ ์๋ค. 0x13371337์ 10์ง์๋ก ๋ฐ๊พธ๋ฉด 322376503 โ ์ด๊ฒ ์ ๋ต์ด์ ํ๋๊ทธ ์๋งน์ด๋ค.
gdb๋ก ์คํ ์์ ์ ๋ค์ ํ์ธ
์ ์ ๋ถ์๋ง์ผ๋ก ๋๋ด์ง ์๊ณ , ๊ทธ ๋น๊ต๊ฐ ์ค์ ๋ก ์คํ๋ ๋ ๋ ์ง์คํฐ์ ๋ญ๊ฐ ๋ค์ด์๋์ง gdb๋ก ์ง์ ๋ฉ์ถฐ์ ๋ดค๋ค. cmp ๋ช
๋ น์ด ์ฃผ์(0x401b15)์ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ๊ฑธ๊ณ ์ ๋ต์ ํ์ค์
๋ ฅ์ผ๋ก ํ๋ ค๋ณด๋ธ ๋ค eax๋ฅผ ํ์ธํ๋ค.
break *0x401b15
run < input.txt # input.txt = "322376503"
printf "eax(์
๋ ฅ๊ฐ) = 0x%x\n", $eax
eax๊ฐ 0x13371337๊ณผ ์ ํํ ์ผ์นํ๊ณ , continueํ๋ฉด ๋ฐ๋ก Correct!๊ฐ ์ฐํ๋ค. ์ ์ ๋ถ์(objdump)๊ณผ ๋์ ํ์ธ(gdb)์ด ๊ฐ์ ๊ฒฐ๋ก ์ ๊ฐ๋ฆฌํจ๋ค.
๐ฏ ํ์ด โ ๋ฐ์ด๋๋ฆฌ์์ ์์ ํ๋ ๋ฝ์๋ด๊ธฐ
๋์ค์ด์
๋ธํ ํ์๋ ์์ด, cmp eax,imm32์ ์ธ์ฝ๋ฉ(3D + 4๋ฐ์ดํธ ๋ฆฌํ์๋์ธ ์์)์ ์๊ณ ์์ผ๋ ํ์ผ์์ ๊ทธ 5๋ฐ์ดํธ๋ง ์ง์ ์ฝ์ด๋ ๋๋ค. non-PIE๋ผ ๊ฐ์์ฃผ์์์ 0x400000๋ง ๋นผ๋ฉด ํ์ผ ์คํ์
์ด ๋์จ๋ค.
import struct
data = open("extracted/simple_crack_me", "rb").read()
CMP_VADDR = 0x401b15 # cmp eax, imm32 (opcode 3d + imm32 LE)
off = CMP_VADDR - 0x400000 # non-PIE: file offset = vaddr - 0x400000
opcode, imm = data[off], struct.unpack_from("<I", data, off + 1)[0]
assert opcode == 0x3D, "expected cmp eax,imm32 opcode"
print(f"target constant = 0x{imm:x} = {imm}")
print(f"FLAG: DH{{{imm}}}")์คํ ๊ฒฐ๊ณผ์, ์ค์ ๋ฐ์ด๋๋ฆฌ์ ๊ทธ ๊ฐ์ ๋ฃ์ด Correct!๊ฐ ๋จ๋ ๊ฒ๊น์ง ํ ํ๋ฉด์์ ํ์ธ๋๋ค.

target constant = 0x13371337 = 322376503
FLAG: DH{322376503}๐ ๊ฒฐ๋ก
์ด ๋ฌธ์ ๊ฐ ๋ณด์ฌ์ฃผ๋ ๊ฑด ๋จ์ํ์ง๋ง ๋ฆฌ๋ฒ์ฑ์ ๊ธฐ๋ณธ๊ธฐ๋ค โ ๋น๊ต ๋ช
๋ น์ด์ ์คํผ๋๋๋ ์ฝ๋ ์์ฒด์ ์๊ฒจ์ง๋ ๋ฐ์ดํฐ๋ผ, strip์ด๋ ์ ์ ๋งํฌ๋ก๋ ์ ๋ ๊ฐ๋ ค์ง์ง ์๋๋ค. ์ฌ๋ณผ ์ด๋ฆ์ ์ง์ธ ์ ์์ด๋ cmp eax, 0x13371337 ๊ฐ์ ๋ฆฌํฐ๋ด ๋น๊ต๊ฐ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ๋ ์๊ฐ ๊ทธ๋๋ก ๋
ธ์ถ๋๋ค. ์ค์ ์ํํธ์จ์ด์์ ๋ผ์ด์ ์ค ํค๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ด๋ฐ ์์ ํ๋์ฝ๋ฉ๋ ์์ ๋น๊ต๋ก ์งํค๋ฉด, ์ ์ ๋ถ์ ํ ๋ฒ์ ๋ซ๋ฆฐ๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค. ์ง์ง ๋น๋ฐ์ ์ฝ๋์ ๋ฆฌํฐ๋ด๋ก ๋ฃ๋ ๊ฒ ์๋๋ผ, ์๋ฒ ๊ฒ์ฆ์ด๋ ํด์ ๋น๊ต์ฒ๋ผ ์ญ์ฐ์ด ์ด๋ ค์ด ๋ฐฉ์์ผ๋ก ์ง์ผ์ผ ํ๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ