[๐Ÿฅ‰ Bronze 4] ๋น„๊ต์‹์„ ๋’ค์ง‘์–ด ํ‚ค๋ฅผ ๋ณต์›ํ•˜๋‹ค โ€” DreamHack Easy Assembly ํ’€์ด

2026-07-13ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 4] ๋น„๊ต์‹์„ ๋’ค์ง‘์–ด ํ‚ค๋ฅผ ๋ณต์›ํ•˜๋‹ค โ€” DreamHack Easy Assembly ํ’€์ด

์†์œผ๋กœ ์ง  ์–ด์…ˆ๋ธ”๋ฆฌ ํฌ๋ž™๋ฏธ. check_password๊ฐ€ ์ž…๋ ฅ์„ len๊ณผ enc_flag๋กœ XORํ•ด 0์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ, ์ด ๋น„๊ต์‹์„ ๋’ค์ง‘์œผ๋ฉด ์ •๋‹ต ํ‚ค = enc_flag ^ len ์ด๋‹ค. ํ‚ค ๊ธธ์ด๊ฐ€ 48์ด๋ผ enc_flag๋ฅผ 0x30์œผ๋กœ XORํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฐ”๋กœ ๋‚˜์˜ค๊ณ , ๊ทธ ํ‚ค๋ฅผ ๋„ฃ์œผ๋ฉด "You nailed it!"์œผ๋กœ ํ™•์ธ๋œ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” Easy Assembly ๋ถ„๋ฅ˜: Reversing ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 4 FLAG: DH{UGxlYXNlIGRvIG5vdCBiYXNlNjQgZGVjb2RlIGl0Lg==}

libc ์—†์ด ์†์œผ๋กœ ์ง  ์ž‘์€ ์–ด์…ˆ๋ธ”๋ฆฌ ํฌ๋ž™๋ฏธ๋‹ค. <key>๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋งž์œผ๋ฉด "You nailed it!"์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ฒ€์‚ฌ ๋กœ์ง์ด XOR ๋ช‡ ์ค„๋ฟ์ด๋ผ, ๊ทธ ์‹์„ ๋’ค์ง‘์œผ๋ฉด ์ •๋‹ต ํ‚ค๊ฐ€ ๊ทธ๋Œ€๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.

check_password์˜ ๋น„๊ต์‹(input^len^enc_flag==0)์„ ๋’ค์ง‘์œผ๋ฉด ์ •๋‹ต ํ‚ค = enc_flag ^ len, ์ฆ‰ enc_flag ^ 0x30
check_password์˜ ๋น„๊ต์‹(input^len^enc_flag==0)์„ ๋’ค์ง‘์œผ๋ฉด ์ •๋‹ต ํ‚ค = enc_flag ^ len, ์ฆ‰ enc_flag ^ 0x30

๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…Easy Assembly
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 4
๋ถ„๋ฅ˜Reversing (x86 32-bit ELF, static, not stripped)
์ œ๊ณต ํŒŒ์ผprob (์ง์ ‘ ์ž‘์„ฑํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ”์ด๋„ˆ๋ฆฌ)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•XOR ๋น„๊ต์‹ ์—ญ์‚ฐ โ€” ์ •๋‹ต ํ‚ค = enc_flag ^ len

์‹ฌ๋ณผ์ด ๋‚จ์•„ ์žˆ์–ด(check_password, enc_flag) ํ๋ฆ„ ํŒŒ์•…์ด ์‰ฝ๋‹ค. ๊ฒ€์‚ฌ์‹ ํ•œ ์ค„๋งŒ ๋’ค์ง‘์œผ๋ฉด ๋๋‚œ๋‹ค.



๐Ÿ”ฌ ์ •์ฐฐ โ€” ์ž…๋ ฅ์„ enc_flag์™€ ๋Œ€์กฐํ•œ๋‹ค

entry0๋Š” ์ธ์ž <key>๋ฅผ ๋ฐ›์•„ check_password(enc_flag, key)๋ฅผ ๋ถ€๋ฅด๊ณ , ๋ฐ˜ํ™˜๊ฐ’์ด 0์ด๋ฉด ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

mov  edi, enc_flag          ; 0x804a000 (์•”ํ˜ธํ™”๋œ ์ •๋‹ต)
mov  esi, ecx               ; argv[1] = ์‚ฌ์šฉ์ž ์ž…๋ ฅ key
call check_password
cmp  eax, 0
je   success                ; 0 ์ด๋ฉด "You nailed it!"

enc_flag๋Š” .data์— ๋ฐ•ํžŒ 42~48๋ฐ”์ดํŠธ์งœ๋ฆฌ ๋ฐ”์ดํŠธ์—ด์ด๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ด ๊ฐ’๊ณผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋Œ€์กฐํ•˜๋Š”์ง€๊ฐ€ ์ „๋ถ€์ด๋ฏ€๋กœ, check_password๋ฅผ ๋œฏ๋Š”๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” XOR ๋น„๊ต์‹์„ ๋’ค์ง‘๋Š”๋‹ค

check_password๋Š” ํ•œ ๊ธ€์ž์”ฉ ๋„๋Š” ์งง์€ ๋ฃจํ”„๋‹ค.

r2 -q -c "pd 16 @ 0x0804906b" prob
radare2 check_password ๋””์Šค์–ด์…ˆ๋ธ” โ€” input[i] ^ len ^ enc_flag[i] ๋ฅผ ๋ˆ„์ (or)ํ•ด 0์ธ์ง€ ๊ฒ€์‚ฌ
radare2 check_password ๋””์Šค์–ด์…ˆ๋ธ” โ€” input[i] ^ len ^ enc_flag[i] ๋ฅผ ๋ˆ„์ (or)ํ•ด 0์ธ์ง€ ๊ฒ€์‚ฌ

ํ•ต์‹ฌ ์„ธ ์ค„์ด ์ด๋ ‡๋‹ค.

mov dl, byte [esi]        ; dl = input[i]
xor dl, byte [len]        ; dl ^= len          (์ž…๋ ฅ ๊ธธ์ด)
xor dl, byte [edi]        ; dl ^= enc_flag[i]
or  ecx, dl               ; ๊ฒฐ๊ณผ๋ฅผ ecx์— ๋ˆ„์ 

์ฆ‰ ๋งค ์ž๋ฆฌ๋งˆ๋‹ค input[i] ^ len ^ enc_flag[i]๋ฅผ ๊ตฌํ•ด ecx์— OR๋กœ ์Œ“๊ณ , ๋๊นŒ์ง€ ์ „๋ถ€ 0์ด์–ด์•ผ(=ecx==0) ํ†ต๊ณผํ•œ๋‹ค. ์ด ์กฐ๊ฑด์„ ์ž๋ฆฌ๋ณ„๋กœ ํ’€๋ฉด ์ •๋‹ต ํ‚ค๊ฐ€ ๊ณง๋ฐ”๋กœ ๋‚˜์˜จ๋‹ค.

input[i] ^ len ^ enc_flag[i] = 0
โ‡’ input[i] = enc_flag[i] ^ len

์—ฌ๊ธฐ์„œ len์€ ์ž…๋ ฅ ํ‚ค์˜ ๊ธธ์ด๋‹ค. ์ •๋‹ต ํ‚ค์˜ ๊ธธ์ด๊ฐ€ ๊ณง ํ”Œ๋ž˜๊ทธ ๊ธธ์ด(48)์ด๋ฏ€๋กœ len = 48 = 0x30. ๊ฒฐ๊ตญ ์ •๋‹ต ํ‚ค = enc_flag ^ 0x30 ์ด๋‹ค. XOR์€ ์ž๊ธฐ์—ญ์›์ด๋ผ, ์ €์žฅ๋œ enc_flag๋ฅผ ๊ฐ™์€ 0x30์œผ๋กœ ๋‹ค์‹œ XORํ•˜๋ฉด ์›๋ฌธ์ด ๋ณต์›๋œ๋‹ค.



๐ŸŽฏ ํ’€์ด โ€” enc_flag ^ 0x30

enc_flag 48๋ฐ”์ดํŠธ๋ฅผ ๋ฝ‘์•„ 0x30์œผ๋กœ XORํ•œ๋‹ค. ์ค‘๊ฐ„์— ์žˆ๋Š” 0x00 ๋ฐ”์ดํŠธ๋„ ์‹ค์ œ ๋ฐ์ดํ„ฐ(0x00 ^ 0x30 = '0')์ด๋ฏ€๋กœ ๋„๋กœ ๋Š์ง€ ์•Š๋Š” ๊ฒŒ ํ•จ์ •์ด๋‹ค.

# decode.py
import base64
data = open("prob", "rb").read()
off  = data.find(bytes.fromhex("74784b6577485c69"))   # enc_flag ์‹œ์ž‘
enc  = data[off:off+48]                                # 48๋ฐ”์ดํŠธ (๋‚ด๋ถ€ 0x00 ๋„ ๋ฐ์ดํ„ฐ)
flag = bytes(b ^ 0x30 for b in enc).decode()
print("FLAG    :", flag)
print("b64 ์•ˆ์ชฝ :", base64.b64decode(flag[3:-1]).decode())
decode.py ์‹คํ–‰ โ€” enc_flag ^ 0x30 ์œผ๋กœ ํ”Œ๋ž˜๊ทธ ๋ณต์›, ๋‚ด๋ถ€ base64๋Š” ๋†๋‹ด ๋ฉ”์‹œ์ง€
decode.py ์‹คํ–‰ โ€” enc_flag ^ 0x30 ์œผ๋กœ ํ”Œ๋ž˜๊ทธ ๋ณต์›, ๋‚ด๋ถ€ base64๋Š” ๋†๋‹ด ๋ฉ”์‹œ์ง€

๋ณต์›๋œ ํ”Œ๋ž˜๊ทธ์˜ DH{} ์•ˆ์ชฝ์€ base64์ธ๋ฐ, ํ’€์–ด ๋ณด๋ฉด Please do not base64 decode it.์ด๋ผ๋Š” ์žฅ๋‚œ์ด ๋“ค์–ด ์žˆ๋‹ค. ๋ณต์›ํ•œ ํ‚ค๋ฅผ ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„ฃ์–ด ๊ฒ€์ฆํ•œ๋‹ค.

./prob "DH{UGxlYXNlIGRvIG5vdCBiYXNlNjQgZGVjb2RlIGl0Lg==}"
๋ณต์›ํ•œ ํ‚ค๋ฅผ ์ธ์ž๋กœ ์‹คํ–‰ํ•˜๋‹ˆ "You nailed it! You're ASM savvy" ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
๋ณต์›ํ•œ ํ‚ค๋ฅผ ์ธ์ž๋กœ ์‹คํ–‰ํ•˜๋‹ˆ "You nailed it! You're ASM savvy" ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

You nailed it!์ด ๋–ด๋‹ค. ๋ณต์›ํ•œ ํ‚ค๊ฐ€ ์ •๋‹ต์ด ๋งž๋‹ค.

FLAG: DH{UGxlYXNlIGRvIG5vdCBiYXNlNjQgZGVjb2RlIGl0Lg==}



๐Ÿ“ ๊ฒฐ๋ก 

๊ฒ€์‚ฌ์‹์€ ๊ณง ์ •๋‹ต์˜ ๋ฐฉ์ •์‹์ด๋‹ค.

ํฌ๋ž™๋ฏธ์˜ ๋น„๊ต ๋ฃจํ‹ด์€ "์ž…๋ ฅ์ด ๋งž๋Š”๊ฐ€"๋ฅผ ํŒ์ •ํ•˜๋ ค๊ณ  ์ •๋‹ต๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ์ฝ”๋“œ๋กœ ์ ์–ด ๋‘” ๊ฒƒ์ด๋‹ค. ๊ทธ ๊ด€๊ณ„๊ฐ€ XOR์ฒ˜๋Ÿผ ๊ฐ€์—ญ์ด๋ฉด, ํŒ์ •์‹์„ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ’€๊ธฐ๋งŒ ํ•˜๋ฉด ์ •๋‹ต์ด ๊ทธ๋Œ€๋กœ ๋–จ์–ด์ง„๋‹ค. ๋ธŒ๋ฃจํŠธํฌ์Šค๋„ ํ•„์š” ์—†๋‹ค.

๋„์ด๋ผ๊ณ  ๋‹ค ๋์ด ์•„๋‹ˆ๋‹ค.

enc_flag ์ค‘๊ฐ„์˜ 0x00์„ ๋ฌธ์ž์—ด ๋์œผ๋กœ ์ฐฉ๊ฐํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ž˜๋ฆฐ๋‹ค. ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๊ธธ์ด๋ฅผ ๋”ฐ๋กœ ๋“ค๊ณ  ๋‹ค๋‹ˆ๋ฉฐ ๊ทธ ๋ฐ”์ดํŠธ๋„ ๋ฐ์ดํ„ฐ๋กœ ์“ด๋‹ค. ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋„ ์ข…๋‹จ์„ ํ•จ๋ถ€๋กœ ๊ฐ€์ •ํ•˜์ง€ ์•Š๋Š” ์Šต๊ด€์ด ํ•„์š”ํ•˜๋‹ค.

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 2] Duff's device๋กœ ํŽผ์นœ ์œ„์น˜๋ณ„ XOR ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack legacyopt ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] Duff's device๋กœ ํŽผ์นœ ์œ„์น˜๋ณ„ XOR ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack legacyopt ํ’€์ด

์ž…๋ ฅ์„ Duff's device๋กœ ํŽผ์นœ ๋ฃจํ”„์—์„œ ์œ„์น˜๋ณ„ ์ƒ์ˆ˜์™€ XORํ•ด hex๋กœ ์ถœ๋ ฅํ•˜๋Š” ์ธ์ฝ”๋” ๋ฌธ์ œ. ๊ฐ ์ถœ๋ ฅ ๋ฐ”์ดํŠธ๊ฐ€ ๊ทธ ์ž๋ฆฌ ์ž…๋ ฅ์—๋งŒ ๋‹ฌ๋ ค ์žˆ์–ด, ๊ฐ™์€ ๊ธธ์ด์˜ ์•Œ๋ ค์ง„ ์ž…๋ ฅ์„ ํ•œ ๋ฒˆ ๋„ฃ์–ด ์œ„์น˜๋ณ„ XOR ์ƒ์ˆ˜๋ฅผ ์บ๋‚ธ ๋’ค ์ฃผ์–ด์ง„ ์ถœ๋ ฅ์— ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณต์›๋œ๋‹ค. ์žฌ์ธ์ฝ”๋”ฉ์ด ์›๋ณธ๊ณผ ์ผ์น˜ํ•จ๊นŒ์ง€ ํ™•์ธํ–ˆ๋‹ค.
#dreamhack#ctf#reversing+4
2026-07-14#dreamhack +4
[๐Ÿฅ‰ Bronze 3] XORยท๋ง์…ˆยท๋น„ํŠธํšŒ์ „์„ ๊ฑฐ๊พธ๋กœ ๋˜์งš๋‹ค โ€” DreamHack nub_rev01 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] XORยท๋ง์…ˆยท๋น„ํŠธํšŒ์ „์„ ๊ฑฐ๊พธ๋กœ ๋˜์งš๋‹ค โ€” DreamHack nub_rev01 ํ’€์ด

์ž…๋ ฅ ํ•œ ๊ธ€์ž์”ฉ XORยท๋ง์…ˆยท๋น„ํŠธํšŒ์ „์„ ๊ฑธ์–ด ์Šคํƒ์— ๋ฐ•ํžŒ ์ƒ์ˆ˜์™€ ๋น„๊ตํ•˜๋Š” ๋ฆฌ๋ฒ„์‹ฑ ํฌ๋ž™๋ฏธ. ์„ธ ์—ฐ์‚ฐ์ด ๋ชจ๋‘ ๊ฐ€์—ญ์ด๋ผ, ๋น„๊ต ๋Œ€์ƒ(target)์—์„œ ์—ญ์ˆœ์œผ๋กœ ํšŒ์ „์„ ํ’€๊ณ  ๋ง์…ˆ์„ ๋นผ๊ณ  XOR๋ฅผ ๋˜๋Œ๋ฆฌ๋ฉด ์ •๋‹ต ์ž…๋ ฅ์ด ๊ทธ๋Œ€๋กœ ๋ณต์›๋œ๋‹ค. ๋ณต์›ํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„ฃ์–ด Correct๋กœ ํ™•์ธํ–ˆ๋‹ค.
#dreamhack#ctf#reversing+4
2026-07-14#dreamhack +4
[๐Ÿฅ‰ Bronze 3] ์›ํ˜• ๋ฆฌ์ŠคํŠธ ์ธ์ฝ”๋”๋ฅผ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋’ค์ง‘๋‹ค โ€” DreamHack tiny-ouroboroi ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] ์›ํ˜• ๋ฆฌ์ŠคํŠธ ์ธ์ฝ”๋”๋ฅผ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋’ค์ง‘๋‹ค โ€” DreamHack tiny-ouroboroi ํ’€์ด

์ž…๋ ฅ ๊ฐ ๊ธ€์ž๋ฅผ ๊ทธ ๊ธ€์ž๊ฐ’ ๊ธธ์ด์˜ ์›ํ˜• ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด ํšŒ์ „ยทํ† ๊ธ€ํ•œ ๋’ค ๋น„ํŠธ๋ฅผ ๋ชจ์•„ ํ•œ ๋ฐ”์ดํŠธ์”ฉ ์ถœ๋ ฅํ•˜๋Š” ์ธ์ฝ”๋” ๋ฌธ์ œ. ์ถœ๋ ฅ์˜ ๊ฐ ๋ฐ”์ดํŠธ๊ฐ€ ์˜ค์ง ๊ทธ ์ž๋ฆฌ ๊ธ€์ž์™€ ์œ„์น˜์—๋งŒ ์˜์กดํ•˜๋ฏ€๋กœ, ํ•จ์ˆ˜๋ฅผ ๋‹ค ์—ญ์‚ฐํ•  ํ•„์š” ์—†์ด ํ›„๋ณด ๊ธ€์ž๋ฅผ ํ†ต์งธ๋กœ ๋„ฃ์–ด ์œ„์น˜๋ณ„ ๋งคํ•‘์„ ๋งŒ๋“ค๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณต์›๋œ๋‹ค.
#dreamhack#ctf#reversing+3
2026-07-13#dreamhack +4