๋ฌธ์ : 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 |
| ๋์ด๋ | ๐ฅ 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
์ฌ๋ณผ์ด ์ ๋ถ ์ ๊ฑฐ๋ 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
์ธ ํจ์ ๋ค ์ธ์ ๋ ๊ฐ(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์ 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๋จ๊ณ ๋ณํ์ ํฉ์ฑ ํจ์" ํ๋๋ง ํต๊ณผํ๋ค.

์ด ๊ด์ฐฐ์ด ํ์ด์ ์ ๋ถ๋ค. ํฉ์ฑ ํจ์๋ฅผ 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
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()}")
๋ณต์๋ ๋ฌธ์์ด์ด ์ ๋ง ์๋ณธ ์
๋ ฅ์ด์๋์ง๋, ๊ทธ ๋ฌธ์์ด์ ๋ค์ ์ค์ ๋ฐ์ด๋๋ฆฌ์ ๋ฃ์ด output.bin๊ณผ ๋ฐ์ดํธ ๋จ์๋ก ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ์ฌ์คํํด์ ํ์ธํ๋ค โ ์ด๊ฒ ๊ฐ์ฅ ํ์คํ ๊ฒ์ฆ์ด๋ค.
./main program.bin /tmp/verify_out.bin < flag_input.txt
cmp /tmp/verify_out.bin output.bin && echo MATCH
MATCH โ ์ ๋ฐฉํฅ ํ๋ฅผ ๋ค์ง์ด ์ป์ ๋ฌธ์์ด์ ๋ค์ ํ๋ก๊ทธ๋จ์ ๋ฃ์๋๋ output.bin๊ณผ ์์ ํ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค. ์ด๊ฑธ๋ก ์ญ์ฐ์ด ๋ง์๋ค๋ ๊ฒ ์ต์ข
ํ์ ๋๋ค.
๐ ๊ฒฐ๋ก
"๋ณต์กํด ๋ณด์ด๋ ๋ณํ"๊ณผ "์ค์ ๋ก ๋ณต์กํ ๋ณํ"์ ๋ค๋ฅด๋ค.
256๋ฒ์ด๋ผ๋ ๋ฐ๋ณต ํ์๋ง ๋ณด๋ฉด ๊ฒ๋จน๊ธฐ ์ฝ์ง๋ง, ๋งค ๋จ๊ณ๊ฐ ๋ฒํผ์ ๋ชจ๋ ๋ฐ์ดํธ์ ์์ ํ ๋์ผํ ํจ์๋ฅผ ์ ์ฉํ๋ค๋ ๊ฑธ ์์์ฑ๋ ์๊ฐ ๋ฌธ์ ๋ "8๋นํธ ์ ์์ญ์ ๊ฐ์ง ํจ์์ ์ญํจ์ ์ฐพ๊ธฐ"๋ก ์ถ์๋๋ค. ์ ์์ญ์ด 256๊ฐ๋ฟ์ด๋ ์์ ์ ์์กฐ์ฌ๋ก ํ๋ฅผ ๋ง๋ค๋ฉด ๋๊ณ , ์ญํจ์๊ฐ ์กด์ฌํ๋์ง ๊ณ ๋ฏผํ ํ์๋ ์๋ค โ ADD/XOR/์ํ์ด๋์ ์ ๋ถ ์๋ช ํ๊ฒ ๊ฐ์ญ์ด๋ค.
๋ฐ์ดํธ์ฝ๋ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฝ์ ๋ "๋ฌด์์ด ์ํ๋ฅผ ๋๋๋๋๊ฐ"๋ถํฐ ๋ณธ๋ค. ์ด ๋ฌธ์ ์์ ํต์ฌ์ ๊ฐ ์ฐ์ฐ์ ์ฐ์ ์ ์์ฒด๊ฐ ์๋๋ผ, apply() ํฌํผ๊ฐ ์ธ๋ฑ์ค๋ ์ด์ ๋ฐ์ดํธ๋ฅผ ์ ํ ์ฐธ์กฐํ์ง ์๋๋ค๋ ๊ตฌ์กฐ์ ์ฌ์ค์ด์๋ค. ๊ทธ ์ฌ์ค ํ๋๊ฐ "์์น๋ณ๋ก ๋ฐ๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ "๋ฅผ "ํ ํ๋๋ก ๋๋๋ ๋ฌธ์ "๋ก ๋ฐ๊ฟ๋๋๋ค.
๋ฐฉ์ด ๊ด์ ์์ ๋ณด๋ฉด ์ด ์ปค์คํ ์ํธํ(๋ผ๊ธฐ๋ณด๋จ ์ธ์ฝ๋ฉ)์ ๊ทผ๋ณธ์ ์ธ ์ฝ์ ์ ๋ช ํํ๋ค โ ๊ฐ ๋ฐ์ดํธ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋ณํ๋๋ ํ, ๊ทธ ๋ณํ์ด ๋ช ๋จ๊ณ๋ ๊ฒฐ๊ตญ ํ๋์ 256-์ํธ๋ฆฌ ์นํํ๋ก ๋ถ๊ดดํ๋ค. ์ง์ง ํ์ฐ(diffusion)์ ์ํ๋ค๋ฉด ์ธ์ ๋ฐ์ดํธ๋ผ๋ฆฌ ์๋ก ์ํฅ์ ์ฃผ๊ณ ๋ฐ๋ ๋จ๊ณ(์: ๋ธ๋ก ์ํธ์ ๋ฏน์ค ์ปฌ๋ผ, ํน์ ์ต์ํ ์์๋ฅผ ๋ค์๋ ์นํ)๊ฐ ๋ฐ๋์ ์์ด์ผ ํ๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ