๋ฌธ์ : DreamHack โ just read memory ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ Silver 2 FLAG:
DH{7078981632989894389654921898749418541874549056189474343058581690}
๋ฐ๋ ๊ฑด main ํ๋. ์คํํ๋ฉด Input: ์ ๋์ฐ๊ณ ํ ์ค์ ๋ฐ๋๋ค. ์๋ฌด๊ฑฐ๋ ๋ฃ์ผ๋ฉด Wrong, ์ ๋ต์ ๋ฃ์ผ๋ฉด Correct ๋ค์ ํ๋๊ทธ๊ฐ ๋ถ๋๋ค.
๋ฌธ์ ์ด๋ฆ์ด ์ด๋ฏธ ๋ต์ ๋ฐ์ฏค ์๋ ค์ค๋ค. "just read memory" โ ์ ๋ต์ ํ๋ค๊ฒ ์ญ์ฐํ์ง ๋ง๊ณ , ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด ๋ ๊ฑธ ๊ทธ๋ฅ ์ฝ์ผ๋ผ๋ ์๊ธฐ๋ค. ์ค์ ๋ก ์ ๋ต ๊ฒ์ฆ์ ์ฐ์ด๋ ๊ฐ์ ๋น๊ต ์ง์ ์ ํ ์์ ํต์งธ๋ก ์ฌ๋ผ์ ์๋ค.
๊ทธ๋๋ ์ ๊ทธ๊ฒ ๋๋์ง๋ ๋ด์ผ ์ฌ๋ฐ๋ค. ์ ๋ต์ ๋ง๋๋ ์ฝ๋๊ฐ ๋ฃจํ ์ธ๋ฑ์ค๋ฅผ ์ฐ๋ ์ฒํ๋ฉด์ ์ค์ ์ด๊ธฐํ๋ ์ ํ ์คํ ์ฌ๋กฏ์ ํจ์ ์ธ ๊ฐ๊ฐ ๋๋ ค์ฐ๋ ๋ฐฉ์์ผ๋ก ์จ์ ์ ํ์์ ๊ตด๋ฆฐ๋ค. ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ํ๊ณ , ๋ง์ง๋ง์ gdb ํ ๋ฐฉ์ผ๋ก ๋ง๋ฌด๋ฆฌํ๋ค.
๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | just read memory |
| ๋์ด๋ | ๐ฅ Silver 2 |
| ๋ถ๋ฅ | Reversing |
| ์ ๊ณต ํ์ผ | main (x86-64 ELF, PIE, not stripped) |
| ์๋ฒ | ์์ โ ํ์ผ๋ง์ผ๋ก ์๊ฒฐ (needs_vm=false) |
| ํต์ฌ ๊ธฐ๋ฒ | ํจ์๋ค์ด ๊ณต์ ํ๋ ์ด๊ธฐํ ์ ๋ ์คํ ์ฌ๋กฏ์ผ๋ก ๋ง๋ ์จ์ ์ ํ์ + ํ ๋ฐํ์ ๋คํ |
ํ์ด ํ๋ฆ์ ์งง๋ค. main์ด 64๊ฐ์ง๋ฆฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์
๋ ฅ๊ณผ ํ ๋ฐ์ดํธ์ฉ ๋น๊ตํ๋ค๋ ๊ฑธ ํ์ธํ๊ณ , ๋
ธ๋ ๊ฐ์ด ์ด๋์ ์ค๋์ง ํฌํผ ์ธ ๊ฐ๋ฅผ ์ฝ์ด ์ ํ์์ผ๋ก ์ ๋ฆฌํ ๋ค์, gdb๋ก ๋ฆฌ์คํธ๋ฅผ ํ์์ ๊ทธ๋๋ก ๋ ์ ์ ๋ต ์
๋ ฅ์ ๋ณต์ํ๋ค.
๐ ์ ์ฐฐ โ ์ฌ๋ณผ๋ถํฐ ๋ณธ๋ค
not stripped ๋ฐ์ด๋๋ฆฌ๋ผ ์ฌ๋ณผ์ด ๊ทธ๋๋ก ๋จ์ ์๋ค. ์ด๋ฆ๋ง ๋ด๋ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง๋ค.
file main
nm main | grep -E "generate_flag|append_list|unknown_func|cnt|head_node|tail_node"
strings main | grep -E "Input|Wrong|Correct|flag is DH"
append_list,head_node,tail_nodeโ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ง์ ๊ตด๋ฆฐ๋ค.generate_flagโ ๋ ธ๋์ ์ฑ์ธ ๊ฐ์ ๋ง๋๋ ํจ์๋ก ๋ณด์ธ๋ค.unknown_func1,unknown_func2โ ์ด๋ฆ์ ์ ์ง์ด์ค ๊ฑธ ๋ณด๋ฉด ์ฌ๊ธฐ์ ๋ญ๊ฐ ์จ๊ฒผ๋ค.- ์ ์ญ
cntโ ์นด์ดํฐ. ๋ค์์ ์ด๊ฒ ์ด์ ๋ค.
๋ฌธ์์ด์ Input: / Wrong / Correct / flag is DH{. ๋ฑ ์์ํ ๋๋ก๋ค.
๐ฌ main ์ฝ๊ธฐ โ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ ๋ ฅ๊ณผ ๋น๊ตํ๋ค
main์์ ๋ ๋ถ๋ถ๋ง ๋ณด๋ฉด ๋๋ค. ๋ฆฌ์คํธ๋ฅผ ์ฑ์ฐ๋ ๋ฃจํ์, ๊ทธ ๋ฆฌ์คํธ๋ฅผ ์
๋ ฅ๊ณผ ๋์กฐํ๋ ๋ฃจํ๋ค.
objdump -d -M intel --start-address=0x1280 --stop-address=0x12f5 main | sed -E -f ann_main.sed
์์ชฝ ๋ฃจํ๋ i๋ฅผ 0๋ถํฐ 0x3f๊น์ง ๋๋ฆฌ๋ฉฐ append_list(i)๋ฅผ ๋ถ๋ฅธ๋ค. i <= 63์ด๋ ๋
ธ๋๊ฐ ์ ํํ 64๊ฐ ์๊ธด๋ค.
1289: mov eax, [rbp-0x4] ; i
128e: call append_list ; append_list(i) โ ์ธ์๋ก i๋ฅผ ๋๊ธฐ์ง๋งโฆ
1293: add DWORD PTR [rbp-0x4],1 ; i++
1297: cmp DWORD PTR [rbp-0x4],0x3f
129b: jle 1289 ; i <= 63 โ 64๊ฐ๋ค์ชฝ ๋ฃจํ๋ head_node->next๋ถํฐ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ, ๊ฐ ๋
ธ๋์ ์ฒซ ๋ฐ์ดํธ(node->value)๋ฅผ ์
๋ ฅ ๋ฒํผ input[j]์ ๋น๊ตํ๋ค. ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด [rbp-0x8](์ ๋ต ํ๋๊ทธ)์ 0์ผ๋ก ๋ด๋ฆฐ๋ค. ์ค๊ฐ์ ๋น ์ ธ๋๊ฐ์ง ์๊ณ ๋๊น์ง ๋ค ๋๋ค.
12c1: movzx eax, BYTE PTR [rbp+rax*1-0x70] ; input[j]
12cd: movzx eax, BYTE PTR [rax] ; node->value
12d3: cmp edx, eax ; ๋ ๋ฐ์ดํธ ๋น๊ต
12d5: je 12de
12d7: mov DWORD PTR [rbp-0x8], 0 ; ๋ค๋ฅด๋ฉด ์คํจ ํ์์ ๋ฆฌํ๋ฉด ์ ๋ต ์
๋ ฅ์ 64๊ฐ ๋
ธ๋์ ๊ฐ์ ์์๋๋ก ์ด์ด๋ถ์ธ ๋ฐ์ดํธ์ด์ด๋ค. ๊ทธ๋ฌ๋ ๋
ธ๋ ๊ฐ์ด ์ด๋ป๊ฒ ์ ํด์ง๋์ง๋ง ์๋ฉด ๋๋๋ค. ๋
ธ๋๋ append_list ์์์ ๋ง๋ค์ด์ง๋ ๊ฑฐ๊ธฐ๋ก ๋ด๋ ค๊ฐ๋ค.
๐ ์ฝ์ง โ "๋ ธ๋ ๊ฐ = f(i)" ๋ผ๋ ์ฐฉ๊ฐ
โถ๐ ์ฝ์ง โ append_list(i) ์ i ๋ฅผ ๋ ธ๋ ๊ฐ์ ์ฌ๋ฃ๋ก ๋ดค๋ค
main์ด append_list(i)๋ก ์ธ๋ฑ์ค๋ฅผ ๋๊ธฐ๊ณ , generate_flag๊ฐ [rbp-0x4]๋ฅผ ์ฝ์ด ๊ฐ์ ๋ง๋๋ ๊ฑธ ๋ณด๊ณ ์ฒ์์ ๋น์ฐํ "๋
ธ๋ ๊ฐ์ i์ ํจ์๊ฒ ์ง" ํ๊ณ ์ ๊ทผํ๋ค. i๋ฅผ ๊ทธ๋๋ก, ํน์ i ๊ธฐ๋ฐ ์ฐ์ ๋ก ๋ฃ์ด ๋
ธ๋ ์ด์ ์์ธกํด ๋ดค๋๋ฐ ์ค์ ๊ฐ๊ณผ ํ๋๋ ์ ๋ง์๋ค.
๋ฌธ์ ๋ generate_flag๊ฐ ์ฝ๋ [rbp-0x4]๊ฐ i๊ฐ ์๋๋ผ๋ ๋ฐ ์์๋ค. append_list๋ ์ธ์ i๋ฅผ [rbp-0x14]์ ์ ์ฅํ๋ค. ์ดํ ํฌํผ๋ค์ด ๋ง์ง๋ [rbp-0x4]๋ ๊ทธ ํ๋ ์์ ์ ํ ๋ค๋ฅธ, ์ด๊ธฐํ๋ ์ ๋ ์ฌ๋กฏ์ด๋ค. ์ฆ append_list๊ฐ ๋ฐ์ i๋ ๋ฃจํ ํ์๋ฅผ ์ธ๋ ๊ฒ ๋ง๊ณ ๋ ๋
ธ๋ ๊ฐ์ ์๋ฌด ๊ธฐ์ฌ๋ ํ์ง ์๋๋ค.
์ด ์ฐฉ๊ฐ์ ๊ฑท์ด๋ด๊ณ ๋์์ผ unknown_func1/2๊ฐ ์ ์กด์ฌํ๋์ง๊ฐ ๋ณด์๋ค. ๋
ธ๋ ๊ฐ์ ์ง์ง ์ฌ๋ฃ๋ i๊ฐ ์๋๋ผ ์ ์ญ cnt์๋ค.
๐ฃ ํต์ฌ โ ํจ์ ์ ์ด ๋๋ ค์ฐ๋ ์คํ ์ฌ๋กฏ
append_list๋ ๋
ธ๋๋ฅผ ๋ง๋ค๊ธฐ ์ ์ unknown_func1 โ unknown_func2 โ generate_flag๋ฅผ ์ฐจ๋ก๋ก ๋ถ๋ฅธ๋ค. ์
๋ค push rbp; mov rbp, rsp๋ง ํ๊ณ ์คํ์ ๋ ์ ์ก๋๋ค. ๊ทธ๋์ ์ธ ํจ์์ [rbp-0x4]๋ ๊ฐ์ ์คํ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ํ ํจ์๊ฐ ๊ฑฐ๊ธฐ ์จ ๋์ ๊ฐ์ ๋ค์ ํจ์๊ฐ ๊ทธ๋๋ก ์ด์ด๋ฐ๋๋ค. ์ง์ญ ๋ณ์์ธ ์ฒํ์ง๋ง ์ค์ ์
์ด ๊ณต์ ํ๋ ์ฌ๋กฏ์ด๋ค.
objdump -d -M intel --start-address=0x13f8 --stop-address=0x1472 main | sed -E -f ann_helpers.sed
์
์ ์ด์ด ์ฝ์ผ๋ฉด ์ฌ๋กฏ ๊ฐ(slot)์ ๋ณํ๋ ์ด๋ ๋ค.
unknown_func1:slot = cntโ ์ ์ญcnt๋ฅผ ๊ณต์ ์ฌ๋กฏ์ผ๋ก ๋ก๋.unknown_func2:slot = (slot+5)*3, ๋ค์(slot-7)*9, ๋ง์ง๋ง์+0x1f. ์ ๊ฐํ๋ฉดslot = 27*cnt + 103.generate_flag: ๋จผ์ cnt = slot์ผ๋ก ์ ์ญ์ ๊ฐฑ์ ํ๊ณ ,return (slot % 74) + 0x30.
์ฌ๊ธฐ์ generate_flag ๋์ imul ... 0xdd67c8a7 โ shr โ imul ..., 0x4a(=74) โ sub ํ๋ฆ์ ์ปดํ์ผ๋ฌ๊ฐ ๋๋์
์ ๊ณฑ์
์ผ๋ก ๋ฐ๊พผ ๊ด์ฉ๊ตฌ๋ค. ์์ผ๋ก ํ๊ธฐ ๊ท์ฐฎ์ผ๋ ๋งค์ง ์์๊ฐ ์ ๋ง 74๋ก ๋๋ ๋๋จธ์ง์ธ์ง ํ์ด์ฌ์ผ๋ก ์ ๊ตฌ๊ฐ ํ์ธํ๋ค.
# check_magic.py โ generate_flag ๋์ ๋งค์ง ๋๋ฒ ๋๋์
์ด (v % 74) ์ธ์ง ๊ฒ์ฆ
MASK = 0xFFFFFFFF
def asm_mod74(v):
v &= MASK
q = ((v >> 1) * 0xdd67c8a7) >> 32 # 64๋นํธ ๊ณฑ์ ์์ 32๋นํธ
q >>= 5 # q == v // 74
return (v - 74 * q) & MASK # == v % 74
bad = sum(asm_mod74(v) != v % 74 for v in range(0, 2_000_000))
print(f"checked 0..2_000_000 : mismatches = {bad}")
๋ถ์ผ์น 0. ๊ทธ๋ฌ๋ ๋
ธ๋ ๊ฐ์ (slot % 74) + '0'์ด๊ณ , slot์ ๋งค ๋
ธ๋๋ง๋ค cnt์ ๋ค์ ์ ์ฅ๋๋ค. cnt๋ .bss๋ผ ์ฒ์์ 0. ๊ฒฐ๊ตญ ์ธ๋ฑ์ค๋ ์ด๋์๋ ์ ์ฐ์ด๊ณ , ์ ์ญ ํ๋๋ง ๋๋ ์ ํ ํฉ๋ ์ ํ์(LCG)์ด ๋จ๋๋ค.
cnt_0 = 0
cnt_{i+1} = (27 * cnt_i + 103) mod 2**32
node[i] = (cnt_{i+1} % 74) + ord('0')
27*cnt+103์ด 32๋นํธ ์์์ ๋๋ ๋
ธ๋ ๊ฐ์ (x % 74) + '0' ๋ฒ์, ์ฆ '0'(0x30)๋ถํฐ 'y'(0x79)๊น์ง์ ์ถ๋ ฅ ๊ฐ๋ฅํ ๋ฌธ์๋ค. ๊ณต๋ฐฑ์ด ์์ด scanf("%64s")๋ก 64๋ฐ์ดํธ๊ฐ ํต์งธ๋ก ๋ค์ด๊ฐ๋ค.
๐ฏ just read memory โ ํ์์ ์ ๋ต์ ์ค๋๋ค
์ ํ์์ ์์์ผ๋ ํ์ด์ฌ์ผ๋ก ์ ๋ต์ ๋ฝ์๋ ๋์ง๋ง, ๋ฌธ์ ๊ฐ ์ํค๋ ๋๋ก ํ๋ ๊ฒ ๋ ๋น ๋ฅด๊ณ ํ์คํ๋ค. main์ ์
๋ ฅ์ ๋จผ์ ๋ฐ์ ๋ค ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์คํธ ๊ฐ์ ์
๋ ฅ๊ณผ ๋ฌด๊ดํ๊ฒ ํญ์ ๊ฐ๋ค. ๊ทธ๋ฌ๋ ์
๋ ฅ์ ์ ์ค๋(๋น stdin) ๋ฆฌ์คํธ๋ ์ ์์ ์ผ๋ก ์์ฑ๋๋ค.
๋ฆฌ์คํธ ์์ฑ์ด ๋๋๋ ์ง์ (main+0xd4, ๋น๊ต ๋ฃจํ ์ง์ )์ ๋ธ๋ ์ดํฌ๋ฅผ ๊ฑธ๊ณ , head_node->next๋ถํฐ ์ฒด์ธ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ๊ฐ ๋
ธ๋์ ์ฒซ ๋ฐ์ดํธ๋ง ์ด์ด ์ถ๋ ฅํ๋ฉด ๊ทธ๊ฒ ์ ๋ต ์
๋ ฅ์ด๋ค.
# read_memory.gdb
break *main+0xd4
run < /dev/null
set $node = *(unsigned long *)(*(unsigned long *)&head_node + 8)
while $node != 0
printf "%c", *(char *)$node
set $node = *(unsigned long *)($node + 8)
endgdb -q -batch -x read_memory.gdb --args ./main
head_node๋ ๊ฐ 0์ง๋ฆฌ ๋๋ฏธ๋ผ head->next๋ถํฐ ์ฝ๋๋ค. ๋์ค๋ 64๋ฐ์ดํธ MxaDc03Lq\clEbET5XEtshc4[Nw:C@;6o0AT=NCJKh;2iV[:E69rS^qPsb7vytO2๊ฐ ๊ทธ๋๋ก ์ ๋ต ์
๋ ฅ์ด๋ค. ๋ฆฌ๋ฒ์ฑ์ ์ฌ์ค์ ์ฌ๊ธฐ์ ๋๋๋ค โ ์ ํ์์ ์์ผ๋ก ์ ํ์ด๋, ๊ฐ์ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ๋ค ์๋ค.

๐ Full solve
๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ ๊ฐ๊ณผ ์ ํ์์ผ๋ก ๊ณ์ฐํ ๊ฐ์ด ๊ฐ์์ง ๊ต์ฐจ ๊ฒ์ฆํ๊ณ , ๊ทธ ์
๋ ฅ์ ๋ฐ์ด๋๋ฆฌ์ ๋๋ก ๋จน์ฌ ํ๋๊ทธ๊น์ง ๋ฐ๋๋ค. ์ฑ๊ณต ๋ถ๊ธฐ๊ฐ ์ถ๋ ฅํ๋ ํ๋๊ทธ๋ ๊ฐ ์
๋ ฅ ๋ฐ์ดํธ์ ๋์๋ฆฌ(input[i] % 10, "%d")๋ฅผ ์ด์ด๋ถ์ธ ๊ฒ์ด๋ค.
# solve.py โ ์จ์ ์ ํ์์ ์ฌํํด ์ ๋ต ์
๋ ฅ์ ๋ณต์ํ๊ณ , ๋ฐ์ด๋๋ฆฌ๋ก ๊ฒ์ฆ
import subprocess
MASK = 0xFFFFFFFF
def node_bytes():
cnt, out = 0, []
for _ in range(64):
slot = cnt
slot = (slot + 5) & MASK # unknown_func2
slot = (slot * 3) & MASK
slot = (slot - 7) & MASK
slot = (slot * 9) & MASK
slot = (slot + 0x1f) & MASK
cnt = slot # generate_flag: cnt = slot
out.append(((slot % 74) + 0x30) & 0xFF)
return bytes(out)
correct = node_bytes()
print(f"[*] recovered correct input ({len(correct)} bytes):")
print(f" {correct.decode('latin-1')!r}")
# ์ฑ๊ณต ๋ถ๊ธฐ๋ DH{ + ๊ฐ input[i] % 10 + } ๋ฅผ ์ฐ๋๋ค
predicted = "DH{" + "".join(str(b % 10) for b in correct) + "}"
print(f"[*] predicted flag: {predicted}")
res = subprocess.run(["./main"], input=correct + b"\n", capture_output=True)
print(f"[*] binary output : {res.stdout.decode('latin-1').strip()}")
์ ํ์์ผ๋ก ๋ง๋ ์
๋ ฅ์ด gdb๋ก ํ์์ ์ฝ์ ๊ฐ๊ณผ ์ ํํ ๊ฐ๊ณ , ๊ทธ ์
๋ ฅ์ ๋ฃ์ผ๋ฉด ๋ฐ์ด๋๋ฆฌ๊ฐ Correct์ ํจ๊ป ํ๋๊ทธ๋ฅผ ๋ฑ๋๋ค.
flag is DH{7078981632989894389654921898749418541874549056189474343058581690}์ด ๊ฐ์ ๋๋ฆผํต์ ์ ์ถํ๋ฉด ์ ๋ต ์ฒ๋ฆฌ๋๋ค.
๐ ๊ฒฐ๋ก
์ ๋ต์ ๋ฉ๋ชจ๋ฆฌ์ ๋จผ์ ๋ง๋ค์ด ๋๋ฉด, ๊ทธ๊ฑด ์ด๋ฏธ ์ ์ถ์ด๋ค.
์ด ๋ฌธ์ ์ ๊ฒ์ฆ๊ธฐ๋ ์ ๋ต ๋ฐ์ดํธ์ด์ ํ์ ํต์งธ๋ก ์ฌ๋ ค๋๊ณ ์ ๋ ฅ๊ณผ ๋น๊ตํ๋ค. ๋น๊ต ๋์์ด ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ํ๋ฌธ์ผ๋ก ์กด์ฌํ๋ ์๊ฐ, ์๋ฌด๋ฆฌ ์์ฑ ๋ก์ง์ ๊ผฌ์๋ ๋ธ๋ ์ดํฌ ํ ๋ฒ์ด๋ฉด ๋๋๋ค. ํด๋ผ์ด์ธํธ ์ธก์์ ์ ๋ต/ํค๋ฅผ ๋ค๊ณ ๋น๊ตํ๋ ๊ตฌ์กฐ ์์ฒด๊ฐ ์ฝ์ ์ด๋ค.
๋๋ ํ๋ "์ ๊ทธ๋ ๊ฒ ๋๋"๋ฅผ ์จ๊ธธ ๋ฟ, "์ง๊ธ ๊ฐ์ด ๋ญ๊ฐ"๋ ๋ชป ์จ๊ธด๋ค.
unknown_func1/2๊ฐ ๊ณต์ ํ๋ ์ด๊ธฐํ ์ ๋ ์คํ ์ฌ๋กฏ ํธ๋ฆญ์ ์ ์ ๋ถ์์ ํ์คํ ์ฑ๊ฐ์๊ฒ ๋ง๋ ๋ค. ์ธ์๋ก ๋์ด์ค๋ i์ ์์ ์ ๋บ๊ธฐ๋ฉด ํ์ฐธ ํค๋งจ๋ค. ํ์ง๋ง ๊ทธ ๋ชจ๋ ๊ณ์ฐ์ ๊ฒฐ๊ณผ๋ ๊ฒฐ๊ตญ ๋ฆฌ์คํธ ๋
ธ๋๋ผ๋ ๊ตฌ์ฒด์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๋๋ค. ์ ์ ์ผ๋ก ์ ํ์์ ๋ณต์ํ๋ ๊ธธ๊ณผ, ๋์ ์ผ๋ก ๊ฒฐ๊ณผ๋ง ์ค๋ ๊ธธ โ ๋ฆฌ๋ฒ์ฑ์์ ๋ ๋ค ์์ ์ตํ ๋๋ ๊ฒ ์ข๋ค. ์ด ๋ฌธ์ ๋ ํ์๊ฐ ํจ์ฌ ์งง๋ค.
์ปดํ์ผ๋ฌ ๊ด์ฉ๊ตฌ๋ ํ๋ก ์ธ์๋๋ฉด ๋น ๋ฅด๋ค.
imul ๋งค์ง ์์ + shr + sub ์กฐํฉ์ ์ญ์คํ๊ตฌ ์์ ๋๋์
์ ๋๋จธ์ง ๊ณ์ฐ์ด๋ค. ๋งค๋ฒ ์์ผ๋ก ์ ๊ฐํ์ง ๋ง๊ณ , ์์ฌ๋๋ฉด ์ค๋์ฒ๋ผ ์ ๊ตฌ๊ฐ์ ํ ๋ฒ ๋๋ ค ํ์ธํ๊ณ ๋์ด๊ฐ๋ฉด ๋๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ