๋ ๋ํ ยท AI ์๋ํ ยท ์์คํ
์์ง๋์ด๋ง
์ง์ ๋ง๋ค๊ณ , ์คํํ๊ณ , ๊ธฐ๋กํ๋ค
ยฉ 2026 ZINO LAB
[๐ฅ ๋ธ๋ก ์ฆ 3] ์ธ ๋จ๊ณ ๋ณํ์ ๊ฑฐ๊พธ๋ก ๋๋๋ฆฌ๋ค โ DreamHack r-xor-t ํ์ด โ ZINO
2026-07-13 ยท 1๋ถ ์ฝ๊ธฐ ยท
์
๋ ฅ 64์๋ฅผ addยท๋ฐฐ์ด ๋ค์ง๊ธฐยทxor ์ธ ๋จ๊ณ๋ก ๋ณํํด ๊ณ ์ ๋ target๊ณผ strncmpํ๋ ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ . ์ธ ์ฐ์ฐ์ด ๋ชจ๋ ๊ฐ์ญ์ด๋ผ, target์์ xor 3์ ํ๊ณ ๋ฐฐ์ด์ ๋ค์ ๋ค์ง๊ณ add 13์ ๋๋๋ฆฌ๋ฉด ์ฌ๋ฐ๋ฅธ ์
๋ ฅ์ด ๊ทธ๋๋ก ๋ณต์๋๋ค. ๊ทธ ์
๋ ฅ์ด ๊ณง ํ๋๊ทธ ๋ณธ๋ฌธ์ด๊ณ , ๋ฐ์ด๋๋ฆฌ์ ๋ฃ์ด Nice!๋ก ํ์ธํ๋ค.
๋ฌธ์ : DreamHack โ r-xor-t
๋ถ๋ฅ : Reversing
๋์ด๋ : ๐ฅ ๋ธ๋ก ์ฆ 3
FLAG : DH{e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63}
๋ฌธ์ ์ค๋ช
์ ์งง๋ค.
์ด ๋ฌธ์ ๋ ์ฌ์ฉ์์๊ฒ ๋ฌธ์์ด ์
๋ ฅ์ ๋ฐ์ ์
๋ ฅ๊ฐ์ ๊ฒ์ฆํ๊ณ ํ๋๊ทธ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ด ์ฃผ์ด์ง๋๋ค. ํด๋น ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํ์ฌ ํ๋๊ทธ๋ฅผ ์ฐพ์ผ์ธ์!
๋ฐ์ด๋๋ฆฌ๋ ์
๋ ฅ์ ๋ฐ์ ์ธ ๋จ๊ณ๋ก ๋ณํํ ๋ค, ๋ฏธ๋ฆฌ ๋ฐํ ์๋ ์ ๋ต ๋ฌธ์์ด๊ณผ ๋น๊ตํ๋ค. ์ผ์นํ๋ฉด Nice! ์ ํจ๊ป Flag is DH{์
๋ ฅ} ์ ์ถ๋ ฅํ๋ค. ์ฆ ์ฌ๋ฐ๋ฅธ ์
๋ ฅ ์์ฒด๊ฐ ํ๋๊ทธ ๋ณธ๋ฌธ ์ด๋ค. ์ธ ๋ณํ์ด ์ ๋ถ ๋๋๋ฆด ์ ์๋ ์ฐ์ฐ์ด๋ผ, ์ ๋ต ๋ฌธ์์ด์์ ์ญ์์ผ๋ก ํ์ด ๋๊ฐ๋ฉด ์
๋ ฅ์ ๊ทธ๋๋ก ๋ณต์ํ ์ ์๋ค.
r-xor-t โ ์
๋ ฅ์ 3๋จ๊ณ ๋ณํํด ๋น๊ต, ๊ฑฐ๊พธ๋ก ํ๋ฉด flag
๋ฌธ์ ๊ฐ์
ํญ๋ชฉ ๋ด์ฉ ๋ฌธ์ ๋ช
r-xor-t ๋์ด๋ ๐ฅ ๋ธ๋ก ์ฆ 3 ๋ถ๋ฅ Reversing (x86-64 ELF) ์ ๊ณต ํ์ผ chall (PIE, dynamically linked, not stripped )๋ชฉํ ๊ฒ์ฆ์ ํต๊ณผํ๋ ์
๋ ฅ = ํ๋๊ทธ ๋ณธ๋ฌธ ๋ณต์ ํต์ฌ ๊ธฐ๋ฒ ๊ฐ์ญ ๋ณํ(addยทreverseยทxor) ์ญ์ฐ์ฐ์ผ๋ก ์
๋ ฅ ๋ณต์
ํ๋๊ทธ๋ DH{ + 64์๋ฆฌ hex + } ํํ๋ค. ๊ทธ 64์๋ฆฌ hex๊ฐ ๋ฐ์ด๋๋ฆฌ์ ๋ฃ์ด์ผ ํ ์
๋ ฅ์ด๋ค.
๋ฐฐ๊ฒฝ โ ๊ฒ์ฆํ ๋ฆฌ๋ฒ์ฑ๊ณผ "๊ฐ์ญ ๋ณํ"
์ด๋ฐ ์ ํ์ ์
๋ ฅ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ฐ๊ณตํ ๋ค ์ ๋ต๊ณผ ๋น๊ตํ๋ ๊ตฌ์กฐ๋ค. ํต์ฌ์ ๊ฐ๊ณต์ ์ฐ์ธ ์ฐ์ฐ์ด ๋๋๋ฆด ์ ์๋๊ฐ ๋ค.
( )์ ๋บ์
( )์ผ๋ก ๋๋๋ฆฐ๋ค. ๋ชจ๋๋ฌ( = mod 128)๊ฐ ๊ฑธ๋ ค ์์ด๋, ๊ฐ์ ๋ชจ๋๋ฌ ๊ณต๊ฐ์์ ๋นผ๋ฉด ์๋ ๊ฐ์ด ๋์จ๋ค.
์ด ๊ธ์ด ๋์์ด ๋๋์?
๐ฅ ํต์ฌ ๐ก ์ธ์ฌ์ดํธ ๐ ์ข์์ ๐คฏ ์ถฉ๊ฒฉ โก ๋น ๋ฆ
๋ง์
x + k
x - k
& 0x7f
๋ฐฐ์ด ๋ค์ง๊ธฐ (reverse)๋ ํ ๋ฒ ๋ ๋ค์ง์ผ๋ฉด ์๋ ์์๋ก ๋์์จ๋ค. ์๊ธฐ ์์ ์ด ์ญ์ฐ์ฐ์ด๋ค.
XOR (x ^ k )์ ๊ฐ์ ํค๋ก ํ ๋ฒ ๋ XORํ๋ฉด ์๋ ๊ฐ์ด ๋๋ค. ์ญ์ ์๊ธฐ์ญ์์ด๋ค.์ธ ์ฐ์ฐ์ด ์ ๋ถ ๊ฐ์ญ์ด๋, ์ ๋ต ๋ฌธ์์ด(๋น๊ต ๋์)์์ ์ ์ฉ๋ ์ญ์์ผ๋ก ๊ฐ ์ญ์ฐ์ฐ์ ๊ฑธ๋ฉด ์๋ ์
๋ ฅ์ด ํต์งธ๋ก ๋ณต์๋๋ค. brute force๋, ์ ์ฝ ํ์ด๋ ํ์ ์๋ค. ์ด ๋ฌธ์ ์ด๋ฆ r-xor-t ๋ ์ฌ์ค ์ด ๋ณํ๋ค(reverseยทxorยทโฆ )์ ๊ฐ๋ฆฌํค๋ ์
์ด๋ค.
๐ฌ ์ ์ฐฐ โ ํจ์ ํ๋์ ๋ฐํ ์๋ ์ ๋ต file ๊ณผ nm ์ผ๋ก ๋ณดํธ ๊ธฐ๋ฒ๊ณผ ์ฌ๋ณผ์ ๋ณธ๋ค. PIE์ง๋ง stripping์ด ์ ๋ผ ์์ด ๋ถ์์ด ์์ํ๋ค.
file chall
nm chall | grep -E " T main| B (input|rot|result)"
strings chall | grep "C@qpl" # ๋น๊ต ๋์์ผ๋ก ์์ฌ๋๋ ๋ฌธ์์ด file/nm/strings โ ํจ์๋ main ํ๋, ์ ์ญ inputยทrotยทresult, .rodata์ target ๋ฌธ์์ด C@qpl==Bpplโฆ
ํจ์๋ main ํ๋๋ฟ์ด๊ณ , ์ ์ญ ๋ฒํผ input , rot , result ๊ฐ ๋ณด์ธ๋ค. ๊ทธ๋ฆฌ๊ณ .rodata ์ C@qpl==Bppl@<=pGโฆA=@q ๋ผ๋ 64์์ง๋ฆฌ ์์ํ ๋ฌธ์์ด์ด ์๋ค. ์ด๊ฒ ๋ณํ ๊ฒฐ๊ณผ์ ๋น๊ตํ **์ ๋ต(target)**์ด๋ค.
๐งช ๋ณํ ๋ถ์ โ ์ธ ๋จ๊ณ main ์ ๋์ค์ด์
๋ธํด ๋ณด๋ฉด ์
๋ ฅ์ ์ธ ๋จ๊ณ์ ๋ณํ์ด ์์๋๋ก ๊ฑธ๋ฆฐ๋ค. ๋จผ์ ์
๋ ฅ ๊ธธ์ด๊ฐ 0x40 (64)์ธ์ง ํ์ธํ ๋ค, ์ฒซ ๋จ๊ณ๋ค.
rot[i] = (input[i] + 13) & 0x7f // i = 0..63 main 1๋จ๊ณ โ ๊ฐ ์
๋ ฅ ๋ฐ์ดํธ์ 13์ ๋ํ๊ณ 0x7f๋ก ๋ง์คํฌํด rot ๋ฐฐ์ด์ ์ ์ฅ
๊ฐ ์
๋ ฅ ๋ฐ์ดํธ์ 13 (0xd )์ ๋ํ๊ณ & 0x7f ๋ก 7๋นํธ๋ง ๋จ๊ฒจ rot[i] ์ ๋ฃ๋๋ค. ๋ ๋ฒ์งธ ๋จ๊ณ๋ ์ด rot ๋ฐฐ์ด์ ํต์งธ๋ก ๋ค์ง๋๋ค.
result[i] = rot[63 - i] // ๋ฐฐ์ด ์ ์ฒด reverse main 2๋จ๊ณ โ rot[63]์ result[0]์, result[j]=rot[63-j]๋ก ๋ฐฐ์ด์ ๋ค์ง์
result[0] = rot[63] , result[j] = rot[63-j] , ๋ง์ง๋ง result[63] = rot[0] . ๋ฑ ๋ฐฐ์ด์ ์๋ค๋ก ๋ค์ง๋ ์ฐ์ฐ์ด๋ค. ์ธ ๋ฒ์งธ ๋จ๊ณ๋ XOR์ด๋ค.
result2[i] = result[i] ^ 3 // ํค 3 XOR, ์ดํ strncmp main 3๋จ๊ณ โ result์ ๊ฐ ๋ฐ์ดํธ๋ฅผ 3๊ณผ XORํด result2์ ์ ์ฅ, target๊ณผ strncmp 64๋ฐ์ดํธ ๋น๊ต
result ์ ๊ฐ ๋ฐ์ดํธ๋ฅผ 3 ๊ณผ XORํด result2 ๋ฅผ ๋ง๋ค๊ณ , strncmp(result2, target, 0x40) ์ผ๋ก ์ ๋ต๊ณผ 64๋ฐ์ดํธ๋ฅผ ๋น๊ตํ๋ค. ์ ๋ฆฌํ๋ฉด ๋ณํ์ ์
๋ ฅ โ (+13 & 0x7f) โ ๋ค์ง๊ธฐ โ (^3) โ target๊ณผ ๋น๊ต ๋ค.
โถ ์ฝ์ง: 7๋นํธ ๋ง์คํฌ์ ๋ค์ง๊ธฐ ๋ฐฉํฅ์์ ํ ๋ฒ ํท๊ฐ๋ฆฌ๋ค์ญ์ฐ ๊ณต์์ ์ธ์ธ ๋ ๋ ๊ตฐ๋ฐ์ ์ ๊น ๋งํ๋ค.
ํ๋๋ & 0x7f ๋ค. ์ฒ์์ ๊ทธ๋ฅ input[i] = rot[i] - 13 ์ผ๋ก ๋นผ๋ฉด ๋๊ฒ ๊ฑฐ๋ ํ๋๋ฐ, +13 ๋ค์ 7๋นํธ ๋ง์คํฌ๊ฐ ๊ฑธ๋ ค ์์ด์ ๊ฐ์ด 128์ ๋์ผ๋ฉด wrap๋๋ค. ๊ทธ๋์ ๋บ์
๋ ๋ชจ๋๋ฌ ๊ณต๊ฐ์์ ํด์ผ ํ๋ค. input[i] = (rot[i] - 13) mod 128 . ๋คํํ ํ๋๊ทธ ๋ณธ๋ฌธ์ hex ๋ฌธ์(0-9a-f )๋ผ ๋๋ถ๋ถ ์ด ๋ฒ์ ์์์ ๊น๋ํ๊ฒ ๋จ์ด์ก๋ค.
๋ค๋ฅธ ํ๋๋ ๋ค์ง๊ธฐ ๋ฐฉํฅ์ด๋ค. result[i] = rot[63-i] ๋ฅผ ์ญ์ผ๋ก ํ๋ฉด rot[i] = result[63-i] ๊ฐ ๋๋๋ฐ, ์ธ๋ฑ์ค๋ฅผ ๋ค์ง๋ ์์น๋ฅผ ํท๊ฐ๋ ค์ ์ฒ์์ ํ๋๊ทธ๊ฐ ๊ฑฐ๊พธ๋ก ๋์๋ค. target[i] = result2[i] ์์ ์์ํด result[i] = target[i]^3 , ๊ทธ๋ค์ rot[j] = result[63-j] = target[63-j]^3 ๋ก ์ฐจ๋ถํ ์ธ๋ฑ์ค๋ฅผ ๋ง์ถ๋ ์ ๋๋ก ๋๋ค. ๊ฒฐ๊ตญ input[j] = ((target[63-j] ^ 3) - 13) mod 128 ํ ์ค๋ก ์ ๋ฆฌ๋๋ค.
๐ฃ ํต์ฌ โ ์ญ์์ผ๋ก ์ธ ๋ฒ ๋๋๋ฆฌ๊ธฐ ์ธ ๋ณํ์ด ๋ชจ๋ ๊ฐ์ญ์ด๋, target ์์ ์ ์ฉ๋ ์ญ์(xor โ reverse โ add)์ผ๋ก ์ญ์ฐ์ฐ์ ๊ฑธ๋ฉด ์
๋ ฅ์ด ๋์จ๋ค.
target[i] = result2[i]
โขโปยน result[i] = target[i] ^ 3 (XOR๋ ์๊ธฐ์ญ์)
โกโปยน rot[63-i] = result[i] , ์ฆ rot[j] = target[63-j] ^ 3 (๋ค์ ๋ค์ง๊ธฐ)
โ โปยน input[j] = (rot[j] - 13) mod 128 (add 13 ๋๋๋ฆฌ๊ธฐ, 7๋นํธ ๋ชจ๋๋ฌ)
์ธ ์ค์ ํฉ์น๋ฉด ํ ์์ด ๋๋ค.
input[j] = ( (target[63-j] ^ 3) - 13 ) mod 128
๐ ์ต์คํ๋ก์ target ๋ฌธ์์ด์ .rodata (0x2018 )์ ๋ฐํ ์์ผ๋ objdump -s ๋ก ๋ฝ์ ๊ทธ๋๋ก ์ญ์ฐํ๋ค.
import subprocess, re
out = subprocess. check_output ([ "objdump" , "-s" , "-j" , ".rodata" , "extracted/chall" ]). decode ()
mem = {}
for line in out. splitlines ():
m = re. match ( r "\s *([0-9a-f]+) \s +((?:[0-9a-f]{2,8} ){1,4}) " , line)
if not m: continue
addr = int (m. group ( 1 ), 16 ); hexs = "" . join (m. group ( 2 ). split ())
for i in range ( 0 , len (hexs), 2 ): mem[addr + i // 2 ] = int (hexs[i:i + 2 ], 16 )
target = bytes (mem[ 0x 2018 + i] for i in range ( 64 )) # strncmp ๋์ 64๋ฐ์ดํธ
flag = bytes (((target[ 63 - j] ^ 3 ) - 13 ) % 128 for j in range ( 64 ))
print ( "target :" , target. decode ( 'latin1' ))
print ( "FLAG : DH{ %s }" % flag. decode ()) solve.py ์คํ โ target ๋ฌธ์์ด๊ณผ ์ญ์ฐ์ผ๋ก ๋ณต์ํ ์
๋ ฅ(ํ๋๊ทธ ๋ณธ๋ฌธ) ์ถ๋ ฅ
๋ณต์ํ ์
๋ ฅ์ ์ค์ ๋ฐ์ด๋๋ฆฌ์ ๋ฃ์ด ๊ฒ์ฆํ๋ค. not stripped ๋ผ ๊ทธ๋ฅ ํ์ค์
๋ ฅ์ผ๋ก ํ๋ ค ๋ฃ์ผ๋ฉด ๋๋ค.
echo "e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63" | ./chall ๋ณต์ํ ์
๋ ฅ์ ๋ฐ์ด๋๋ฆฌ์ ๋ฃ์ผ๋ Nice! ์ ํจ๊ป ํ๋๊ทธ๊ฐ ์ถ๋ ฅ๋จ
Input:
Nice!
Flag is DH{e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63} Nice! ๊ฐ ๋จ๊ณ ํ๋๊ทธ๊ฐ ๊ทธ๋๋ก ์ถ๋ ฅ๋๋ค.
๐ ๊ฒฐ๋ก ๊ฐ์ญ ๋ณํ์ผ๋ก ๋ง๋ ๊ฒ์ฆ์ ์ญ์ฐ์ฐ ํ ๋ฒ์ผ๋ก ๋ซ๋ฆฐ๋ค.
์ด ๋ฌธ์ ์ ์ธ ๋จ๊ณ โ add, ๋ฐฐ์ด ๋ค์ง๊ธฐ, XOR โ ๋ ๊ฒ๋ณด๊ธฐ์ ์ฌ๋ฌ ๊ฒน์ด๋ผ ๋ณต์กํด ๋ณด์ด์ง๋ง, ํ๋ํ๋๊ฐ ์ ๋ณด๋ฅผ ์์ง ์๋ ์ผ๋์ผ ๋ณํ์ด๋ค. ๊ทธ๋์ ๋น๊ต ๋์(target)๋ง ์๋ฉด ๋ธ๋ฃจํธํฌ์ค ์์ด ์
๋ ฅ์ ์ ํํ ๋๋๋ฆด ์ ์๋ค. ๋ฆฌ๋ฒ์ฑ์์ ๋ณํ์ ๋ง๋๋ฉด ๋จผ์ "์ด๊ฒ ๋๋๋ฆด ์ ์๋ ์ฐ์ฐ์ธ๊ฐ"๋ฅผ ๋ฐ์ง๋ ๊ฒ ์ฐ์ ์ด๋ค. ๋๋๋ฆด ์ ์์ผ๋ฉด ์ญ์ฐ, ์๋๋ฉด(ํด์ ๋ฑ ๋จ๋ฐฉํฅ) ๊ทธ๋ brute force๋ ๋ค๋ฅธ ์ ๊ทผ์ ๊ณ ๋ฏผํ๋ฉด ๋๋ค.
ํด๋ผ์ด์ธํธ์ ์ ๋ต์ ๋ฐ์ ๋๋ฉด ๊ทธ๊ฑด ์ ๋ต์ด ์๋๋ค.
๋ฐ์ด๋๋ฆฌ ์์ ๋น๊ต์ฉ target ๋ฌธ์์ด์ด ํต์งธ๋ก ๋ค์ด ์์๊ณ , ๋ณํ๋ ๋ชจ๋ ๊ฐ์ญ์ด๋ผ ์ ๋ต ์
๋ ฅ์ด ๊ทธ๋๋ก ๋
ธ์ถ๋๋ค. ์ฌ์ฉ์ ์์ ๋์ด๊ฐ ๋ฐ์ด๋๋ฆฌ์์ "๋ง๋์ง ๊ฒ์ฌ"ํ๋ ๋ก์ง์ ๊ณง "์ ๋ต์ ๋ง๋๋ ๋ก์ง"์ด๊ธฐ๋ ํ๋ค. ๊ฐ์ ์ ๋ง ์ง์ผ์ผ ํ๋ค๋ฉด ๊ฒ์ฆ์ ์๋ฒ์์ ํ๊ฑฐ๋, ์ต์ํ ๋จ๋ฐฉํฅ ํจ์(ํด์)๋ก ๋น๊ตํด ์๋ณธ ๋ณต์์ ๋ง์์ผ ํ๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ