[๐Ÿฅ‰ Bronze 1] ์œ„์น˜ ๋ฌด๊ด€ ๋ฐ”์ดํŠธ ๋ณ€ํ™˜์€ 256๊ฐœ์งœ๋ฆฌ ํ‘œ ํ•˜๋‚˜๋กœ ๋’ค์ง‘ํžŒ๋‹ค โ€” DreamHack ezmix ํ’€์ด

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

[๐Ÿฅ‰ Bronze 1] ์œ„์น˜ ๋ฌด๊ด€ ๋ฐ”์ดํŠธ ๋ณ€ํ™˜์€ 256๊ฐœ์งœ๋ฆฌ ํ‘œ ํ•˜๋‚˜๋กœ ๋’ค์ง‘ํžŒ๋‹ค โ€” DreamHack ezmix ํ’€์ด

stripped ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ program.bin์ด๋ผ๋Š” 2๋ฐ”์ดํŠธ์งœ๋ฆฌ opcode ํ”„๋กœ๊ทธ๋žจ์„ ํ•ด์„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์„ ADD/XOR/ROR 256๋ฒˆ ์—ฐ์†์œผ๋กœ ๋’ค์„ž๋Š”๋‹ค. ์–ธ๋œป ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์„ธ ์—ฐ์‚ฐ ์ „๋ถ€ ๋ฒ„ํผ์˜ ๋ชจ๋“  ๋ฐ”์ดํŠธ์— ๊ฐ™์€ ์ธ์ž๋ฅผ ๋˜‘๊ฐ™์ด ์ ์šฉํ•  ๋ฟ์ด๋ผ, ์ž…๋ ฅ ์œ„์น˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ 0~255 ์ „์ฒด์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ๋งŒ ์ •๋ฐฉํ–ฅ ํ‘œ๋ฅผ ๋งŒ๋“ค๋ฉด ์—ญํ‘œ๋Š” ์ž๋™์œผ๋กœ ๋‚˜์˜จ๋‹ค. output.bin 36๋ฐ”์ดํŠธ์— ์—ญํ‘œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋Œ€์ž…ํ•ด flag๋ฅผ ์ฆ‰์‹œ ๋ณต์›ํ–ˆ๋‹ค.

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

์ œ๊ณต๋˜๋Š” ๊ฑด ๋”ฑ ์„ธ ํŒŒ์ผ์ด๋‹ค. stripped ELF main, ๊ทธ๋ฆฌ๊ณ  program.binยทoutput.bin์ด๋ผ๋Š” ์ •์ฒด๋ถˆ๋ช…์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‘ ๊ฐœ. ์‹คํ–‰ํ•ด๋ณด๋ฉด Insert your string: ํ•œ ์ค„๋งŒ ๋„์šฐ๊ณ  ์ž…๋ ฅ์„ ๋ฐ›์€ ๋’ค ์กฐ์šฉํžˆ ๋๋‚œ๋‹ค โ€” ์–ด๋””์—๋„ ์ •๋‹ต ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ถœ๋ ฅ์ด ์—†๋‹ค. program.bin์„ ํ•ด์„ํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” ์ดˆ์†Œํ˜• ๋ฐ”์ดํŠธ์ฝ”๋“œ VM์ด๋ผ๋Š” ๊ฑธ ํŒŒ์•…ํ•˜๊ณ  ๋‚˜๋ฉด, ํ’€์ด๋Š” ์˜คํžˆ๋ ค ์‚ฐ์ˆ˜์— ๊ฐ€๊นŒ์›Œ์ง„๋‹ค.

ezmix ๋ฌธ์ œ ํŽ˜์ด์ง€ โ€” "I just do what I read"
ezmix ๋ฌธ์ œ ํŽ˜์ด์ง€ โ€” "I just do what I read"


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…ezmix
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 1
๋ถ„๋ฅ˜Reversing
์ œ๊ณตstripped 64๋น„ํŠธ ELF(main) + program.bin(514B) + output.bin(36B)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ปค์Šคํ…€ VM์˜ ๋ฐ”์ดํŠธ ๋ณ€ํ™˜์ด ์œ„์น˜ ๋ฌด๊ด€ยท์ „๋‹จ์‚ฌ(bijective)์ž„์„ ํŒŒ์•…ํ•ด 0~255 ์ „์ˆ˜ํ‘œ๋กœ ์—ญ์‚ฐ

main์€ Usage: %s [program] [output] ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๋ฉฐ, program.bin์„ ์ฝ์–ด ๊ทธ ์•ˆ์˜ ๋ช…๋ น๋Œ€๋กœ ์šฐ๋ฆฌ ์ž…๋ ฅ์„ ๋ณ€ํ˜•ํ•œ ๋’ค output ํŒŒ์ผ์— ์“ด๋‹ค. ๋ชฉํ‘œ๋Š” ๋ฐ˜๋Œ€๋กœ ๊ฐ€๋Š” ๊ฒƒ โ€” output.bin์ด ์ด๋ฏธ ์ฃผ์–ด์กŒ์œผ๋‹ˆ, ๊ทธ๊ฑธ ๋งŒ๋“ค์–ด๋‚ธ ์›๋ณธ ์ž…๋ ฅ(flag)์„ ๊ฑฐ๊พธ๋กœ ์ฐพ์•„๋‚ด๋ฉด ๋œ๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” ์•„์ฃผ ์ž‘์€ ์Šคํƒ ๊ธฐ๋ฐ˜ VM

CTF์˜ ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ์—์„œ "์ปค์Šคํ…€ VM"์€ ํ”ํ•œ ์žฅ์น˜๋‹ค. ์‹ค์ œ ๋กœ์ง์„ ์–ด์…ˆ๋ธ”๋ฆฌ ๋Œ€์‹  ์ž์ฒด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋‘๊ณ , ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๊ทธ๊ฑธ ํ•œ ์ค„์”ฉ ํ•ด์„ํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค. ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ž์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ผ์„œ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ ํ•จ์ˆ˜ ํ๋ฆ„์„ ๋ชป ์žก์•„๋‚ด๋‹ˆ, ๋ถ„์„ํ•˜๋ ค๋ฉด ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ "๋ช…๋ น์–ด ํ•˜๋‚˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€"๋ถ€ํ„ฐ ์ฝ์–ด์•ผ ํ•œ๋‹ค.

์ด ๋ฌธ์ œ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ๊ทน๋‹จ์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๋‹ค. program.bin์„ 2๋ฐ”์ดํŠธ์”ฉ ๋Š์–ด์„œ (opcode, arg) ์Œ์œผ๋กœ ์ฝ๊ณ , opcode์— ๋”ฐ๋ผ ์ •ํ•ด์ง„ ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๋ฒ„ํผ ์ „์ฒด์— ์ ์šฉํ•œ๋‹ค. ๋ช…๋ น์–ด๊ฐ€ ๋ช‡ ๊ฐœ ์—†๋‹ค๋Š” ๊ฒŒ ์˜คํžˆ๋ ค ํžŒํŠธ๋‹ค โ€” ๋ณต์žกํ•œ VM์ผ์ˆ˜๋ก ์ƒํƒœ๊ฐ€ ๋งŽ์•„ ์—ญ์‚ฐ์ด ์–ด๋ ต์ง€๋งŒ, ๋ช…๋ น์–ด๊ฐ€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ ๋ช‡ ๊ฐœ๋ฟ์ด๋ฉด ์—ญํ•จ์ˆ˜๋„ ์‚ฐ์ˆ  ์—ฐ์‚ฐ ๋ช‡ ๊ฐœ๋กœ ๋๋‚œ๋‹ค.


๐Ÿ”ฌ ์ •์ฐฐ โ€” stripped ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ฝ๊ธฐ

๋จผ์ € ๋ณดํ˜ธ๊ธฐ๋ฒ•๊ณผ ํŒŒ์ผ ํ˜•ํƒœ๋ฅผ ๋ณธ๋‹ค.

file main
pwn checksec main

file๊ณผ pwntools checksec ์ถœ๋ ฅ โ€” main์ด ์‹ฌ๋ณผ์ด ์ง€์›Œ์ง„ 64๋น„ํŠธ PIE ์‹คํ–‰ ํŒŒ์ผ์ด๊ณ  Full RELRO, ์Šคํƒ ์นด๋‚˜๋ฆฌ, NX๊ฐ€ ๋ชจ๋‘ ์ผœ์ ธ ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ ๊ณ„์—ด ๊ณต๊ฒฉ์€ ๋ง‰ํ˜€ ์žˆ์Œ์„ ํ™•์ธํ•œ ํ™”๋ฉด
file๊ณผ pwntools checksec ์ถœ๋ ฅ โ€” main์ด ์‹ฌ๋ณผ์ด ์ง€์›Œ์ง„ 64๋น„ํŠธ PIE ์‹คํ–‰ ํŒŒ์ผ์ด๊ณ  Full RELRO, ์Šคํƒ ์นด๋‚˜๋ฆฌ, NX๊ฐ€ ๋ชจ๋‘ ์ผœ์ ธ ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ ๊ณ„์—ด ๊ณต๊ฒฉ์€ ๋ง‰ํ˜€ ์žˆ์Œ์„ ํ™•์ธํ•œ ํ™”๋ฉด

์‹ฌ๋ณผ์ด ์ „๋ถ€ ์ œ๊ฑฐ๋œ stripped ๋ฐ”์ด๋„ˆ๋ฆฌ๋‹ค. ํ•จ์ˆ˜ ๊ฒฝ๊ณ„๋„ ์ด๋ฆ„๋„ ์—†์œผ๋‹ˆ objdump -d๋กœ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ›‘์–ด ํ๋ฆ„์„ ์žก์•„์•ผ ํ•œ๋‹ค. strings๋กœ ๋ฝ‘์•„๋ณด๋ฉด Insert your string:, Usage: %s [program] [output], Error! ์„ธ ๋ฌธ์ž์—ด์ด ๋‚˜์˜ค๋Š”๋ฐ, ์ด ์ค‘ Usage๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ์„œ๋‹ค โ€” main(argc, argv)๊ฐ€ argv[1]์„ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ๋กœ, argv[2]๋ฅผ ์ถœ๋ ฅ ํŒŒ์ผ๋กœ ๋ฐ›๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.

main์„ ๋””์Šค์–ด์…ˆ๋ธ”ํ•ด์„œ ํŒŒ์ผ ๋‘ ๊ฐœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€ ๋”ฐ๋ผ๊ฐ€ ๋ณด๋ฉด, argv[1]์„ ์—ด์–ด ์ตœ๋Œ€ 0x400๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ  ๊ทธ ๋ฒ„ํผ(progbuf)์™€ ๊ธธ์ด(proglen), ๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๋นˆ ๋ฒ„ํผ(outbuf)๋ฅผ ์ธ์ž๋กœ ์–ด๋–ค ํ•จ์ˆ˜ ํ•˜๋‚˜(์ฃผ์†Œ 0x136c, ์ดํ•˜ vm_run)๋ฅผ ๋ถ€๋ฅธ๋‹ค. vm_run ์•ˆ์„ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฃจํ”„๊ฐ€ ๋‚˜์˜จ๋‹ค(์˜์‚ฌ์ฝ”๋“œ๋กœ ์ •๋ฆฌ).

// vm_run(progbuf, proglen, outbuf)
int pc = 0, count = 0;
while (pc < proglen) {
    uint8_t opcode = progbuf[pc];
    uint8_t arg    = progbuf[pc + 1];
    switch (opcode) {
        case 1: apply(add,  arg, outbuf, count); break;  // outbuf[i] += arg  (์ „๋ถ€)
        case 2: apply(xor_, arg, outbuf, count); break;  // outbuf[i] ^= arg  (์ „๋ถ€)
        case 3: apply(rotr, arg, outbuf, count); break;  // outbuf[i] = ROR8(outbuf[i], arg&7)
        case 4:
            printf("Insert your string: ");
            fgets(outbuf, 0x100, stdin);          // outbuf๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ†ต์งธ ๊ต์ฒด
            outbuf[strcspn(outbuf, "\n")] = 0;
            count = strlen(outbuf);
            break;
        default:
            puts("Error!"); exit(1);
    }
    pc += 2;
}

์—ฌ๊ธฐ์„œ apply(func, arg, buf, count)๋Š” buf์˜ count๋ฐ”์ดํŠธ ์ „๋ถ€์— ๋Œ€ํ•ด buf[i] = func(buf[i], arg)๋ฅผ ์ ์šฉํ•˜๋Š” ํ—ฌํผ๋‹ค โ€” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„ ์ฝœ๋ฐฑ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ๋ˆˆ์— ๋ˆ๋‹ค.

add/xor_/rotr ์„ธ ํ•จ์ˆ˜๋„ ๊ฐ๊ฐ objdump๋กœ ํ™•์ธํ–ˆ๋‹ค.

objdump -d -M intel --start-address=0x1289 --stop-address=0x1301 main | sed -f annotate_ops.sed

add/xor/rotr ์„ธ ์—ฐ์‚ฐ ํ•จ์ˆ˜ ๋””์Šค์–ด์…ˆ๋ธ” โ€” ๊ฐ ๋ช…๋ น์— ์ฃผ์„
add/xor/rotr ์„ธ ์—ฐ์‚ฐ ํ•จ์ˆ˜ ๋””์Šค์–ด์…ˆ๋ธ” โ€” ๊ฐ ๋ช…๋ น์— ์ฃผ์„

์„ธ ํ•จ์ˆ˜ ๋‹ค ์ธ์ž ๋‘ ๊ฐœ(a, b)๋ฅผ ๋ฐ›์•„ ๋ฐ”์ดํŠธ ํ•˜๋‚˜๋ฅผ ๋Œ๋ ค์ค€๋‹ค.

  • op1 = ADD: a + b (mod 256)
  • op2 = XOR: a ^ b
  • op3 = ROTATE: b๋ฅผ & 0x7๋กœ ๋งˆ์Šคํ‚น(0~7)ํ•œ ๋’ค (a >> b) | (a << (8-b)) โ€” ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์˜ค๋ฅธ์ชฝ ํšŒ์ „(ROR8)

opcode 4๋Š” ๋ณ€ํ™˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ "Insert your string:" ํ”„๋กฌํ”„ํŠธ๋กœ stdin์„ ์ฝ์–ด ์ž‘์—… ๋ฒ„ํผ ์ „์ฒด๋ฅผ ์šฐ๋ฆฌ ์ž…๋ ฅ์œผ๋กœ ๊ฐˆ์•„๋ผ์šฐ๋Š”" ํŠน์ˆ˜ ๋ช…๋ น์ด๋‹ค. ์ด ์ˆœ๊ฐ„ ๋ฒ„ํผ ๊ธธ์ด(count)๋„ ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋กœ ์ƒˆ๋กœ ์„ค์ •๋œ๋‹ค.

program.bin์„ ์‹ค์ œ๋กœ ํŒŒ์‹ฑํ•ด๋ณด๋ฉด ๊ตฌ์กฐ๊ฐ€ ์•„์ฃผ ๋ช…ํ™•ํ•˜๋‹ค.

xxd program.bin | head -3   # ๋งจ ์•ž (04 90) = opcode 4, "Insert your string" ํŠธ๋ฆฌ๊ฑฐ
xxd output.bin              # ์ตœ์ข… ๊ฒฐ๊ณผ 36๋ฐ”์ดํŠธ

program.binยทoutput.bin xxd โ€” ๋งจ ์•ž 04 90์ด op4(์ž…๋ ฅ ํŠธ๋ฆฌ๊ฑฐ)
program.binยทoutput.bin xxd โ€” ๋งจ ์•ž 04 90์ด op4(์ž…๋ ฅ ํŠธ๋ฆฌ๊ฑฐ)

program.bin์€ 514๋ฐ”์ดํŠธ = 257์Œ์ธ๋ฐ, ๋งจ ์•ž ํ•œ ์Œ๋งŒ opcode 4(์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ฒ„ํผ๋ฅผ ์ดˆ๊ธฐํ™”)๊ณ  ๋‚˜๋จธ์ง€ 256์Œ์€ ์ „๋ถ€ add/xor/rotate ์ค‘ ํ•˜๋‚˜๋‹ค. ์ฆ‰ ์‹คํ–‰ ์ˆœ์„œ๋Š” "๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค โ†’ ๊ทธ ๋ฌธ์ž์—ด ์ „์ฒด์— 256๋ฒˆ์˜ ์‚ฐ์ˆ  ๋ณ€ํ™˜์„ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉํ•œ๋‹ค"๊ฐ€ ์ „๋ถ€๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” ์™œ output.bin์ด ๋”ฑ 36๋ฐ”์ดํŠธ์ธ๊ฐ€

main์ด ์ตœ์ข…์ ์œผ๋กœ ํŒŒ์ผ์— ์“ฐ๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๋Š” vm_run์ด ์ถ”์ ํ•˜๋Š” ๋‚ด๋ถ€ count๊ฐ€ ์•„๋‹ˆ๋ผ outbuf์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ strlen() ์ด๋‹ค. ์ฆ‰ ๋ณ€ํ™˜ ๋„์ค‘ ๋ฐ”์ดํŠธ ๊ฐ’์ด 0x00์ด ๋˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ์ง€์ ์—์„œ ๋ฌธ์ž์—ด์ด ๋Š๊ธด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ ์ถœ๋ ฅ์ด ์›๋ž˜ ์ž…๋ ฅ ๊ธธ์ด๋ณด๋‹ค ์งง์•„์งˆ ์ˆ˜ ์žˆ๋‹ค โ€” ์ฒ˜์Œ์—” ์ด ๋•Œ๋ฌธ์— "ํ˜น์‹œ ์›๋ž˜ ์ž…๋ ฅ์ด 36๋ฐ”์ดํŠธ๋ณด๋‹ค ๊ธธ์—ˆ๋Š”๋ฐ ์ค‘๊ฐ„์— ๋„๋ฐ”์ดํŠธ๊ฐ€ ๋‚˜์™€์„œ ์ž˜๋ฆฐ ๊ฑด ์•„๋‹๊นŒ"๋ฅผ ์˜์‹ฌํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ DreamHack ํ”Œ๋ž˜๊ทธ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ DH{ + 32์ž๋ฆฌ hex + } = ์ •ํ™•ํžˆ 36๋ฐ”์ดํŠธ ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค. output.bin์ด 36๋ฐ”์ดํŠธ๋ผ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ด๋ฏธ "์ž…๋ ฅ ๊ธธ์ด = 36, ๊ทธ๋ฆฌ๊ณ  ๊ทธ 36๋ฐ”์ดํŠธ ์ „ ๊ตฌ๊ฐ„์—์„œ ๋ณ€ํ™˜ ์ค‘ ๋„๋ฐ”์ดํŠธ๊ฐ€ ํ•œ ๋ฒˆ๋„ ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค"๋Š” ๊ฐ•ํ•œ ํžŒํŠธ์˜€๋‹ค. ์‹ค์ œ๋กœ ๋ณต์›ํ•ด๋ณธ ๊ฒฐ๊ณผ๋„ ์ •ํ™•ํžˆ 36๋ฐ”์ดํŠธ DH{...} ํ˜•ํƒœ๋กœ ๋งž์•„๋–จ์–ด์ ธ์„œ, ๋ณ„๋„๋กœ ๊ธธ์ด๋ฅผ ์ถ”์ •ํ•˜๋Š” ๋กœ์ง ์—†์ด ๊ทธ๋ƒฅ output.bin ๊ทธ๋Œ€๋กœ์˜ ๊ธธ์ด๋งŒํผ ์—ญ์‚ฐํ•˜๋ฉด ์ถฉ๋ถ„ํ–ˆ๋‹ค.



๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  ๋ฐ”์ดํŠธ์— ๋˜‘๊ฐ™์ด ์ ์šฉ๋œ๋‹ค

์—ฌ๊ธฐ์„œ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์„ฑ์งˆ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. apply(func, arg, buf, count)๋Š” buf[i]๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ์˜ค์ง buf[i] ์ž๊ธฐ ์ž์‹ ์˜ ํ˜„์žฌ ๊ฐ’๊ณผ ๊ณ ์ •๋œ arg๋งŒ ๋ณธ๋‹ค โ€” ์ธ๋ฑ์Šค i๋‚˜ ๋‹ค๋ฅธ ๋ฐ”์ดํŠธ์˜ ๊ฐ’์€ ์ „ํ˜€ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  256๊ฐœ์˜ ๋ณ€ํ™˜ ๋‹จ๊ณ„ ์ „๋ถ€๊ฐ€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋ฒ„ํผ ์ „์ฒด๋ฅผ ํ›‘๋Š”๋‹ค.

๊ทธ ๋ง์€, ์–ด๋–ค ์œ„์น˜์˜ ๋ฐ”์ดํŠธ๋“  ์ตœ์ข…์ ์œผ๋กœ ๊ฒช๋Š” ๋ณ€ํ™˜ ๊ณผ์ •์€ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค. ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ฐ ๊ธ€์ž๋Š” ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ณ ๋ฐ›์ง€ ์•Š๊ณ , ์˜ค์ง "256๋‹จ๊ณ„ ๋ณ€ํ™˜์˜ ํ•ฉ์„ฑ ํ•จ์ˆ˜" ํ•˜๋‚˜๋งŒ ํ†ต๊ณผํ•œ๋‹ค.

ROR8 ํšŒ์ „ ์˜ˆ์‹œ โ€” a=0x92, b&7=3์ผ ๋•Œ (a ์˜ค๋ฅธ์ชฝ์‹œํ”„ํŠธ3)|(a ์™ผ์ชฝ์‹œํ”„ํŠธ5)=0x52
ROR8 ํšŒ์ „ ์˜ˆ์‹œ โ€” a=0x92, b&7=3์ผ ๋•Œ (a ์˜ค๋ฅธ์ชฝ์‹œํ”„ํŠธ3)|(a ์™ผ์ชฝ์‹œํ”„ํŠธ5)=0x52

์ด ๊ด€์ฐฐ์ด ํ’€์ด์˜ ์ „๋ถ€๋‹ค. ํ•ฉ์„ฑ ํ•จ์ˆ˜๋ฅผ F๋ผ๊ณ  ํ•˜๋ฉด:

output[i] = F(input[i])       (๋ชจ๋“  i์— ๋Œ€ํ•ด ๋™์ผํ•œ F)

F๋Š” 8๋น„ํŠธ ์ž…๋ ฅ์„ 8๋น„ํŠธ ์ถœ๋ ฅ์œผ๋กœ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•œ ์ž…๋ ฅ์€ 0~255, 256๊ฐ€์ง€๋ฟ์ด๋‹ค. ๊ทธ 256๊ฐ€์ง€ ์ „๋ถ€์— ๋Œ€ํ•ด F(x)๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘๋ฉด(์ˆœ๋ฐฉํ–ฅ ํ‘œ), ๊ทธ ํ‘œ๋ฅผ ๋’ค์ง‘๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์—ญํ•จ์ˆ˜ Fโปยน๊ฐ€ ๊ทธ๋ƒฅ ๋‚˜์˜จ๋‹ค โ€” add/xor/rotate ์„ธ ์—ฐ์‚ฐ ๋ชจ๋‘ ์ „๋‹จ์‚ฌ(bijective, ์„œ๋กœ ๋‹ค๋ฅธ ์ž…๋ ฅ์ด ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ๋ ฅ์œผ๋กœ ๊ฐ)๋ผ ์—ญํ‘œ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ž๋ช…ํ•˜๋‹ค(ADD์™€ XOR๋Š” mod 256์—์„œ ์ž๋ช…ํ•œ ์ „๋‹จ์‚ฌ, ROR๋„ ์ˆœ์—ด์ผ ๋ฟ์ด๋‹ค).

์ฆ‰ ์ž…๋ ฅ ๊ธธ์ด๋‚˜ ๊ฐ ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ์ „ํ˜€ ๋ชฐ๋ผ๋„, ํ‘œ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๋ฉด output.bin์˜ ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ ์ฆ‰์‹œ ์›๋ž˜ ๊ฐ’์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ์ค‘์— ์‹ค์ œ๋กœ ๊ทธ๋Ÿฐ์ง€ gdb๋กœ ์ง์ ‘ ํ™•์ธํ–ˆ๋‹ค. op3_rotr(ROTATE)๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋˜๋Š” ์ง€์ ์— ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ๊ฑธ๊ณ , ์ธ์ž๊ฐ’๊ณผ ๋ฐ˜ํ™˜๊ฐ’์ด ๊ณ„์‚ฐํ•œ ๋Œ€๋กœ ๋‚˜์˜ค๋Š”์ง€ ๋ดค๋‹ค.

gdb -q -batch -x cmds.gdb --args ./main program.bin /tmp/gdb_verify_out.bin
# cmds.gdb
break *0x555555554000+0x12c2
run program.bin /tmp/gdb_verify_out.bin < flag_input.txt
printf "op3_rotr() call #1 args -- a=0x%x  b=0x%x  (b&7=%d)\n", $edi, $esi, $esi & 7
finish
printf "returned al = 0x%x\n", $eax & 0xff

gdb ๋Ÿฐํƒ€์ž„ ํ™•์ธ โ€” a=0x92, b&7=3 โ†’ ๋ฐ˜ํ™˜๊ฐ’ 0x52 (์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ์ผ์น˜)
gdb ๋Ÿฐํƒ€์ž„ ํ™•์ธ โ€” a=0x92, b&7=3 โ†’ ๋ฐ˜ํ™˜๊ฐ’ 0x52 (์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ์ผ์น˜)

a=0x92, b&7=3์ผ ๋•Œ ๋ฐ˜ํ™˜๊ฐ’์ด 0x52 โ€” ์†์œผ๋กœ ๊ณ„์‚ฐํ•œ (0x92>>3)|(0x92<<5) = 0x12|0x40 = 0x52์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. PIE๋ผ ๋กœ๋“œ ์ฃผ์†Œ๋Š” ๋งค๋ฒˆ ๋ฐ”๋€Œ์ง€๋งŒ, gdb๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ASLR์„ ๋„๊ณ  ์‹คํ–‰ํ•˜๋ฏ€๋กœ 0x555555554000์ด ๊ณ ์ • ๋ฒ ์ด์Šค๋กœ ์žกํžŒ๋‹ค๋Š” ์ ์„ ์ด์šฉํ–ˆ๋‹ค.


๐Ÿš€ Full Exploit

program.bin์˜ ์ฒซ ์Œ(opcode 4)์„ ๊ฑด๋„ˆ๋›ฐ๊ณ , ๋‚˜๋จธ์ง€ 256์Œ์„ ์ˆœ์„œ๋Œ€๋กœ ํ•ฉ์„ฑํ•ด ์ •๋ฐฉํ–ฅ ํ‘œ๋ฅผ ๋งŒ๋“  ๋’ค ๋’ค์ง‘๋Š”๋‹ค.

prog = open('program.bin', 'rb').read()
output = open('output.bin', 'rb').read()
 
pairs = [(prog[i], prog[i + 1]) for i in range(0, len(prog) - 1, 2)]
assert pairs[0][0] == 4, "first op must be the input-read trigger"
 
def add(a, b):  return (a + b) & 0xff
def xorf(a, b): return (a ^ b) & 0xff
def rotr(a, b):
    b &= 7
    return ((a >> b) | (a << (8 - b))) & 0xff
 
ops = {1: add, 2: xorf, 3: rotr}
 
def forward(x):
    for op, arg in pairs[1:]:
        x = ops[op](x, arg)
    return x
 
table = [forward(x) for x in range(256)]
inv = [0] * 256
for x in range(256):
    inv[table[x]] = x
 
flag = bytes(inv[b] for b in output)
print(f"[+] FLAG: {flag.decode()}")

python3 solve.py ์‹คํ–‰ โ€” 257์Œ ํŒŒ์‹ฑ๋ถ€ํ„ฐ ์—ญํ‘œ ์ ์šฉ๊นŒ์ง€ ์‹ค์ œ ์ถœ๋ ฅ
python3 solve.py ์‹คํ–‰ โ€” 257์Œ ํŒŒ์‹ฑ๋ถ€ํ„ฐ ์—ญํ‘œ ์ ์šฉ๊นŒ์ง€ ์‹ค์ œ ์ถœ๋ ฅ

๋ณต์›๋œ ๋ฌธ์ž์—ด์ด ์ •๋ง ์›๋ณธ ์ž…๋ ฅ์ด์—ˆ๋Š”์ง€๋Š”, ๊ทธ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„ฃ์–ด output.bin๊ณผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ์žฌ์‹คํ–‰ํ•ด์„œ ํ™•์ธํ–ˆ๋‹ค โ€” ์ด๊ฒŒ ๊ฐ€์žฅ ํ™•์‹คํ•œ ๊ฒ€์ฆ์ด๋‹ค.

./main program.bin /tmp/verify_out.bin < flag_input.txt
cmp /tmp/verify_out.bin output.bin && echo MATCH

์‹ค๋ฐ”์ด๋„ˆ๋ฆฌ ์žฌ์‹คํ–‰ โ€” ๋ณต์›ํ•œ flag๋ฅผ ๋‹ค์‹œ ๋„ฃ์–ด ์›๋ณธ output.bin๊ณผ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ผ์น˜ ํ™•์ธ
์‹ค๋ฐ”์ด๋„ˆ๋ฆฌ ์žฌ์‹คํ–‰ โ€” ๋ณต์›ํ•œ flag๋ฅผ ๋‹ค์‹œ ๋„ฃ์–ด ์›๋ณธ output.bin๊ณผ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ผ์น˜ ํ™•์ธ

MATCH โ€” ์ •๋ฐฉํ–ฅ ํ‘œ๋ฅผ ๋’ค์ง‘์–ด ์–ป์€ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ํ”„๋กœ๊ทธ๋žจ์— ๋„ฃ์—ˆ๋”๋‹ˆ output.bin๊ณผ ์™„์ „ํžˆ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. ์ด๊ฑธ๋กœ ์—ญ์‚ฐ์ด ๋งž์•˜๋‹ค๋Š” ๊ฒŒ ์ตœ์ข… ํ™•์ •๋œ๋‹ค.


๐Ÿ“ ๊ฒฐ๋ก 

"๋ณต์žกํ•ด ๋ณด์ด๋Š” ๋ณ€ํ™˜"๊ณผ "์‹ค์ œ๋กœ ๋ณต์žกํ•œ ๋ณ€ํ™˜"์€ ๋‹ค๋ฅด๋‹ค.

256๋ฒˆ์ด๋ผ๋Š” ๋ฐ˜๋ณต ํšŸ์ˆ˜๋งŒ ๋ณด๋ฉด ๊ฒ๋จน๊ธฐ ์‰ฝ์ง€๋งŒ, ๋งค ๋‹จ๊ณ„๊ฐ€ ๋ฒ„ํผ์˜ ๋ชจ๋“  ๋ฐ”์ดํŠธ์— ์™„์ „ํžˆ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•„์ฑ„๋Š” ์ˆœ๊ฐ„ ๋ฌธ์ œ๋Š” "8๋น„ํŠธ ์ •์˜์—ญ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜์˜ ์—ญํ•จ์ˆ˜ ์ฐพ๊ธฐ"๋กœ ์ถ•์†Œ๋œ๋‹ค. ์ •์˜์—ญ์ด 256๊ฐœ๋ฟ์ด๋‹ˆ ์•„์˜ˆ ์ „์ˆ˜์กฐ์‚ฌ๋กœ ํ‘œ๋ฅผ ๋งŒ๋“ค๋ฉด ๋˜๊ณ , ์—ญํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ณ ๋ฏผํ•  ํ•„์š”๋„ ์—†๋‹ค โ€” ADD/XOR/์ˆœํ™˜์ด๋™์€ ์ „๋ถ€ ์ž๋ช…ํ•˜๊ฒŒ ๊ฐ€์—ญ์ด๋‹ค.

๋ฐ”์ดํŠธ์ฝ”๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ฝ์„ ๋• "๋ฌด์—‡์ด ์ƒํƒœ๋ฅผ ๋„˜๋‚˜๋“œ๋Š”๊ฐ€"๋ถ€ํ„ฐ ๋ณธ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ํ•ต์‹ฌ์€ ๊ฐ ์—ฐ์‚ฐ์˜ ์‚ฐ์ˆ ์‹ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, apply() ํ—ฌํผ๊ฐ€ ์ธ๋ฑ์Šค๋‚˜ ์ด์›ƒ ๋ฐ”์ดํŠธ๋ฅผ ์ „ํ˜€ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ตฌ์กฐ์  ์‚ฌ์‹ค์ด์—ˆ๋‹ค. ๊ทธ ์‚ฌ์‹ค ํ•˜๋‚˜๊ฐ€ "์œ„์น˜๋ณ„๋กœ ๋”ฐ๋กœ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ"๋ฅผ "ํ‘œ ํ•˜๋‚˜๋กœ ๋๋‚˜๋Š” ๋ฌธ์ œ"๋กœ ๋ฐ”๊ฟ”๋†“๋Š”๋‹ค.

๋ฐฉ์–ด ๊ด€์ ์—์„œ ๋ณด๋ฉด ์ด ์ปค์Šคํ…€ ์•”ํ˜ธํ™”(๋ผ๊ธฐ๋ณด๋‹จ ์ธ์ฝ”๋”ฉ)์˜ ๊ทผ๋ณธ์ ์ธ ์•ฝ์ ์€ ๋ช…ํ™•ํ•˜๋‹ค โ€” ๊ฐ ๋ฐ”์ดํŠธ๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ํ•œ, ๊ทธ ๋ณ€ํ™˜์ด ๋ช‡ ๋‹จ๊ณ„๋“  ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ 256-์—”ํŠธ๋ฆฌ ์น˜ํ™˜ํ‘œ๋กœ ๋ถ•๊ดดํ•œ๋‹ค. ์ง„์งœ ํ™•์‚ฐ(diffusion)์„ ์›ํ•œ๋‹ค๋ฉด ์ธ์ ‘ ๋ฐ”์ดํŠธ๋ผ๋ฆฌ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๋‹จ๊ณ„(์˜ˆ: ๋ธ”๋ก ์•”ํ˜ธ์˜ ๋ฏน์Šค ์ปฌ๋Ÿผ, ํ˜น์€ ์ตœ์†Œํ•œ ์ˆœ์„œ๋ฅผ ๋’ค์„ž๋Š” ์น˜ํ™˜)๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿ’  Platinum 3] ์‹คํ–‰ ์ค‘์— ์ž๊ธฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ฐˆ์•„๋ผ์šฐ๋Š” .pyc โ€” DreamHack pyc ํ’€์ด
blog

[๐Ÿ’  Platinum 3] ์‹คํ–‰ ์ค‘์— ์ž๊ธฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ฐˆ์•„๋ผ์šฐ๋Š” .pyc โ€” DreamHack pyc ํ’€์ด

dis.dis ๋กœ ์—ด๋ฉด ํ‰๋ฒ”ํ•œ XOR ๊ฒ€์‚ฌ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” .pyc ์ธ๋ฐ, ์ •์ž‘ ๊ทธ ์ฝ”๋“œ๋Š” ํ•œ ๋ฒˆ๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ctypes ๋กœ code object ์˜ co_code ๋ฒ„ํผ๋ฅผ ์ œ์ž๋ฆฌ์—์„œ XOR ํ•ด ์ง„์งœ ๊ฒ€์‚ฌ ๋ฃจํ‹ด์„ ๊บผ๋‚ด ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์†์œผ๋กœ ๋””์ฝ”๋“œํ•ด ๋ณต์›ํ•˜๊ณ , 4๋ฐ”์ดํŠธ ์ฐฝ ROTRยทXOR ๋ณ€ํ™˜์„ ๋’ค์—์„œ ์•ž์œผ๋กœ ๋˜๊ฐ์•„ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฝ‘์•˜๋‹ค.
#dreamhack#ctf#reversing+5
2026-08-04#dreamhack +4
[๐Ÿฅ‡ Gold 4] ์ ํ”„๋„ ๋น„๊ต๋„ ์—†๋Š” VM ์—์„œ flag ๋ฅผ ๋˜๋ฝ‘๊ธฐ โ€” DreamHack bitvm ํ’€์ด
blog

[๐Ÿฅ‡ Gold 4] ์ ํ”„๋„ ๋น„๊ต๋„ ์—†๋Š” VM ์—์„œ flag ๋ฅผ ๋˜๋ฝ‘๊ธฐ โ€” DreamHack bitvm ํ’€์ด

๋ช…๋ น์ด ์—ด ๊ฐœ๋ฟ์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ VM ์ด flag ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋ถ„๊ธฐ๋„ ๋น„๊ต๋„ ์‚ฐ์ˆ ๋„ ์—†๊ณ  ANDยทORยทXOR ๋งŒ ์žˆ๋‹ค. ๊ธ€์ž ํ•˜๋‚˜๋ฅผ ๊ฑฐ๋Š” ์ œ์•ฝ์ด (c & A) == B ์™€ (c | A) == C ๋‘ ์ค„์ด๋ผ, ๋น„ํŠธ๋ณ„๋กœ ์ชผ๊ฐœ๋ฉด c = (A & B) | (~A & C) ๋กœ ๋‹ต์ด ํ•˜๋‚˜์”ฉ ๋”ฑ ๋–จ์–ด์ง„๋‹ค. ๋ธŒ๋ฃจํŠธํฌ์Šค๋„ ์†”๋ฒ„๋„ ํ•„์š” ์—†์—ˆ๋‹ค.
#dreamhack#ctf#reversing+6
2026-08-04#dreamhack +4
[๐Ÿฅˆ Silver 4] "L๋ฒˆ ๋„๋‹ˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋”ํ•ด์กŒ๊ฒ ์ง€"๋Š” ํ‹€๋ฆฐ ์ง๊ด€์ด์—ˆ๋‹ค โ€” DreamHack pybycodetes ํ’€์ด
blog

[๐Ÿฅˆ Silver 4] "L๋ฒˆ ๋„๋‹ˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋”ํ•ด์กŒ๊ฒ ์ง€"๋Š” ํ‹€๋ฆฐ ์ง๊ด€์ด์—ˆ๋‹ค โ€” DreamHack pybycodetes ํ’€์ด

์‹คํ–‰ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํŒŒ์ด์ฌ dis.dis() ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋คํ”„ ๋‘ ์žฅ(main.txt, hard2rev.txt)๊ณผ ์ถœ๋ ฅ ๊ฒฐ๊ณผ(output.txt)๋งŒ ์ฃผ์–ด์ง€๋Š” ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ. opcode๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ์–ด ํŒŒ์ด์ฌ ์†Œ์Šค๋กœ ์žฌ๊ตฌ์„ฑํ•˜๋ฉด, flag๋ฅผ ๋ฐ”์ดํŠธ XOR ํ•œ ๋’ค ๊ฐ’ ํ•˜๋‚˜์— +36์„ ํ•˜๊ณ  ๋ฐฐ์—ด ์ „์ฒด๋ฅผ j//2๋ฒˆ ๋’ค์ง‘๋Š” ๊ฑธ ๋ฐ˜๋ณตํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค. "๋ฃจํ”„๊ฐ€ L๋ฒˆ ๋„๋‹ˆ๊นŒ ๊ฐ ์›์†Œ์— ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋”ํ•ด์กŒ๊ฒ ์ง€"๋ผ๋Š” ์ฒซ ์ง๊ด€์€ ํ‹€๋ ธ๋‹ค โ€” ๋ฐ˜๋ณต๋˜๋Š” ๋ฐ˜์ „ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ฐ’์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฑธ๋ฆฌ๊ธฐ๋„, ์•„์˜ˆ ์•ˆ ๊ฑธ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค. ์‹ค์ œ ๊ฐ’ ๋Œ€์‹  "์œ„์น˜ ๋ผ๋ฒจ" ๋ฐฐ์—ด์„ ๋˜‘๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตด๋ ค ์ •ํ™•ํ•œ ํšŸ์ˆ˜์™€ ์ตœ์ข… ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์—ญ์‚ฐํ•ด flag๋ฅผ ๋ณต์›ํ–ˆ๋‹ค.
#dreamhack#ctf#reversing+3
2026-07-21#dreamhack +4