[the art of unpacking]

58
1 | ํŽ˜์ด์ง€ [The Art of Unpacking] Mark Vincent Yason Malcode Analyst, X-Force Research & Development IBM internet Security Systems, email:[email protected] (์ด ๋ฌธ์„œ๋Š” beistlab ๋ฉค๋ฒ„ ashine ์ด ๋ฒˆ์—ญํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. Email: [email protected]) ์š” ์•ฝ: ์–ธํŒจํ‚น์€ ์˜ˆ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€์ ์ถ ๋„์ ‚์ด๊ณ  ๊ฐ€์žฅ ํฅ๋ถ„๋˜๋Š” ๋ฆฌ๋ฒ„์‹ฑ์˜ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ๋ฒ„์„œ ๋“ค์€ ์šฒ์˜์ฒด์ œ์˜ ๋ณธ์งˆ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„์•ผ ๋˜๊ณ  ๋งค์šฐ ๊นŒ๋‹ค๋กœ์šฒ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ๊ณผ ํŒจ์ปค๋‚˜ ํ”„๋กœํ…ํ„ฐ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„์•ผ ๋ฉ๋‹ˆ๋‹ค. ์ถ๋‚ด์™€ ์˜๋ฆฌํ•จ์€ ์„ฑ๊ณต์ ์ถ ์–ธํŒฉ์„ ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์–ธํŒจํ‚น์€ ํŒจ์ปค๋ฅผ ๋งŠ๋“  ์‚ฌ๋žŒ๋“ค๊ณผ ๋‹ค๋ฅธ ์ท์„ ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค ๋ชจ๋‘ ๋„์ ‚ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค ๋ชจ๋‘ ๋ณดํ˜ธ๋ฅผ ์šฐํšŒ ํ• ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ž…๋‹ˆ๋‹ค. ์ด๋ฌธ์„œ์˜ ์ฒซ ๋ฒˆ์žฌ ๋ชฉ์ ์€ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ๋“ค๊ณผ ํŒจ์ปค์™€ ํ”„๋กœํ…ํ„ฐ๋“ค์— ๋Œ€ํ•ด ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‰ฝ๊ฒŒ ๊ตฌํ• ์ˆ˜ ์ž‡๋Š” ํˆด๋กœ ํ”„๋กœํ…ํ„ฐ๋ฅผ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ฌด๋ ฅํ•˜๊ฒŒ ๋งŠ๋“œ๋Š” ๊ฒƒ๋„ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด์ •๋ณด๋Š” ํŠนํžˆ ์—ฐ๊ตฌ์›๋“ค์ด ํŒจํ‚น๋œ ์•…์„ฑ์ฝ”๋“œ๋“ค์„ ๋ถ„์„ ํ•  ์ˆ˜ ์ž‡๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์žฅ์— ๋‚˜์˜ฌ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์€ ์„ฑ๊ณต์ ์ถ ๋ถ„์„์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ๋ชฉ์ ์€ ์ด ์ •๋ณด๊ฐ€ ์•Œ๋ ค์ง€๋ฉด์„œ ์—ฐ๊ตฌ์›๋“ค์€ ๋ณดํ˜ธ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์„œ ๋ฆฌ๋ฒ„์„œ๋“ค์ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ถ„์„ํ•˜๋Š” ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” ๊ฒƒ์„ ํ•  ์ˆ˜ ์ž‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋กž ๋ฆฌ๋ฒ„์„œ๋“ค์„ ๋ฉˆ์ถ”๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ : reverse engineering, packers, protectors, anti-debugging, anti-reversing

Upload: others

Post on 15-Feb-2022

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [The Art of Unpacking]

1 | ํŽ˜ ์ด ์ง€

[The Art of Unpacking]

Mark Vincent Yason

Malcode Analyst, X-Force Research & Development

IBM internet Security Systems, email:[email protected]

(์ด ๋ฌธ์„œ๋Š” beistlab ๋ฉค๋ฒ„ ashine ์ด ๋ฒˆ์—ญํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. Email: [email protected])

์š” ์•ฝ: ์–ธํŒจํ‚น์€ ์˜ˆ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€์ ์ถ ๋„์ ‚์ด๊ณ  ๊ฐ€์žฅ ํฅ๋ถ„๋˜๋Š” ๋ฆฌ๋ฒ„์‹ฑ์˜ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ๋ฒ„์„œ ๋“ค์€

์šฒ์˜์ฒด์ œ์˜ ๋ณธ์งˆ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„์•ผ ๋˜๊ณ  ๋งค์šฐ ๊นŒ๋‹ค๋กœ์šฒ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ๊ณผ ํŒจ์ปค๋‚˜ ํ”„๋กœํ…ํ„ฐ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„์•ผ ๋ฉ๋‹ˆ๋‹ค.

์ถ๋‚ด์™€ ์˜๋ฆฌํ•จ์€ ์„ฑ๊ณต์ ์ถ ์–ธํŒฉ์„ ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์–ธํŒจํ‚น์€ ํŒจ์ปค๋ฅผ ๋งŠ๋“  ์‚ฌ๋žŒ๋“ค๊ณผ ๋‹ค๋ฅธ ์ท์„ ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค ๋ชจ๋‘ ๋„์ ‚ํ•ฉ๋‹ˆ๋‹ค.

์ด๋“ค ๋ชจ๋‘ ๋ณดํ˜ธ๋ฅผ ์šฐํšŒ ํ• ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ž…๋‹ˆ๋‹ค.

์ด๋ฌธ์„œ์˜ ์ฒซ ๋ฒˆ์žฌ ๋ชฉ์ ์€ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ๋“ค๊ณผ ํŒจ์ปค์™€ ํ”„๋กœํ…ํ„ฐ๋“ค์— ๋Œ€ํ•ด ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‰ฝ๊ฒŒ ๊ตฌํ• ์ˆ˜ ์ž‡๋Š” ํˆด๋กœ

ํ”„๋กœํ…ํ„ฐ๋ฅผ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ฌด๋ ฅํ•˜๊ฒŒ ๋งŠ๋“œ๋Š” ๊ฒƒ๋„ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด์ •๋ณด๋Š” ํŠนํžˆ ์—ฐ๊ตฌ์›๋“ค์ด ํŒจํ‚น๋œ ์•…์„ฑ์ฝ”๋“œ๋“ค์„ ๋ถ„์„ ํ•  ์ˆ˜

์ž‡๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์žฅ์— ๋‚˜์˜ฌ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์€ ์„ฑ๊ณต์ ์ถ ๋ถ„์„์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ๋ชฉ์ ์€ ์ด ์ •๋ณด๊ฐ€

์•Œ๋ ค์ง€๋ฉด์„œ ์—ฐ๊ตฌ์›๋“ค์€ ๋ณดํ˜ธ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์„œ ๋ฆฌ๋ฒ„์„œ๋“ค์ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ถ„์„ํ•˜๋Š” ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” ๊ฒƒ์„ ํ•  ์ˆ˜ ์ž‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋กž ๋ฆฌ๋ฒ„์„œ๋“ค์„ ๋ฉˆ์ถ”๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ : reverse engineering, packers, protectors, anti-debugging, anti-reversing

Page 2: [The Art of Unpacking]

2 | ํŽ˜ ์ด ์ง€

์ฐจ๋ บ

1. ์„œ๋ก  ............................................................................................................................................................................................... 3

2. TECHNIQUES : DEBUGGER DETECTION ........................................................................................................................... 4

2.1 PEB.BEINGDEBUGGED FLAG: ISDEBUGGERPRESENT() ........................................................................................................ 4 2.2 PEB.NTGLOBALFLAG, HEAP.HEAPFLAGS, HEAP.FORCEFLAGS .......................................................................................... 5 2.3 DEBUGPORT: CHECKREMOTEDEBUGGERPRESENT() / NTQUERYINFORMATIONPROCESS() .............................................. 7 2.4 DEBUGGER INTERRUPTS ........................................................................................................................................................ 10 2.5 TIMING CHECKS ..................................................................................................................................................................... 12 2.6 SEDEBUGPRIVILEGE .............................................................................................................................................................. 14 2.7 PARENT PROCESS ................................................................................................................................................................... 15 2.8 DEBUGOBJECT: NTQUERYOBJECT() .................................................................................................................................... 16 2.9 DEBUGGER WINDOW .............................................................................................................................................................. 17 2.10 DEBUGGER PROCESS ............................................................................................................................................................ 18 2.11 DEVICE DRIVERS .................................................................................................................................................................. 19 2.12 OLLYDBG:GUARD PAGES .................................................................................................................................................... 20

3. THCHMIQUES : BREAKPOINT AND PATCHING DETECTION .................................................................................... 22

3.1 SOFRWARE BREAKPOINT DETECTION ................................................................................................................................... 22 3.2 HARDWARE BREAKPOINT DETECTION .................................................................................................................................. 23 3.3 PATCHING DETECTION VIA CODE CHECKSUM CALCULATION ............................................................................................ 26

4. TECHNIQUES:ANTI-ANALYSIS ........................................................................................................................................... 27

4.1 ENCRYPTION AND COMPRESSION .......................................................................................................................................... 27 4.2 GARBAGE CODE AND CODE PERMUTATION ......................................................................................................................... 29 4.3 ANTI-DISASSEMBLY ............................................................................................................................................................... 34

5. THCHNIQUES : DEBUGGER ATTACKS ............................................................................................................................. 37

5.1 MISDIRECTION AND STOPPING EXECUTION VIA EXCEPTIONS ............................................................................................. 38 5.2 BLOCKING INPUT .................................................................................................................................................................... 40 5.3 THREADHIDEFROMDEBUGGER ............................................................................................................................................. 41 5.4 DISABLING BREAKPOINTS ...................................................................................................................................................... 42 5.5 UNHANDLED EXCEPTION FILTER .......................................................................................................................................... 44 5.6 OLLYDBG:OUTPUTDEBUGSTRION() FORMAT STRING BUG ................................................................................................ 45

6.TECHNIQUES:ADVANCED AND OTHER TECHNIQUES ................................................................................................ 46

6.1 PROCESS INJECTION ............................................................................................................................................................... 46 6.2 DEBUGGER BLOCKER ............................................................................................................................................................. 48 6.3 TLS CALLBACKS .................................................................................................................................................................... 49 6.4 STOLEN BYTES ....................................................................................................................................................................... 51 6.5 API REDIRECTION .................................................................................................................................................................. 53 6.6 MULTI-THREADED PACKERS ................................................................................................................................................. 54 6.7 VIRTUAL MACHINES .............................................................................................................................................................. 54

7. TOOLS ......................................................................................................................................................................................... 55

7.1 OLLYDBG ............................................................................................................................................................................... 55 7.2 OLLYSCRIPT ........................................................................................................................................................................... 56 7.3 OLLY ADVANCED ................................................................................................................................................................... 56 7.4 OLLYDUMP ............................................................................................................................................................................. 57 7.5 IMPREC ................................................................................................................................................................................... 57

8. REFERENCES ............................................................................................................................................................................ 57

Page 3: [The Art of Unpacking]

3 | ํŽ˜ ์ด ์ง€

1. ์„œ๋ก 

๋ฆฌ๋ฒ„์Šค์—”์ง€๋‹ˆ์–ด๋ง์—์„œ ํŒจ์ปค๋Š” ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šฒ ํผ์ฆ ํ’€๊ธฐ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ํผ์ฆ์„ ํ‘ธ๋Š” ๊ณผ์ •์— ๋ฆฌ๋ฒ„์„œ๋“ค์€ OS ์˜ ๋ณธ์งˆ๊ณผ

๋ฆฌ๋ฒ„์‹ฑ์˜ ํŠธ๋ฆญ, ํˆด ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ๋” ๋ง‹์€ ์ง€์‹์„ ์–ป์Šต๋‹ˆ๋‹ค.

ํŒจ์ปค(์ด๋ฌธ์„œ ์—์„œ๋Š” ํ”„๋กœํ…ํ„ฐ์™€ ์‹คํ–‰์••์ถ• ๋‘˜๋‹ค๋ฅผ ์˜๋ฏธ)๋Š” ํŒŒ์ท์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์„ ๋ณดํ˜ธํ•ด์ค๋‹ˆ๋‹ค.

ํŒจ์ปค๋Š” ํ•ฉ๋ฒ•์ ์œผ๋กœ ์ƒ์šฉํ”„๋กœ๊ทธ๋žจ์„ ํฌ๋ž™ ํ•˜๊ฑฐ๋‚˜ ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰์œ„๋ฅผ ์˜ˆ๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์•…์„ฑ์ฝ”๋“œ ๋˜ํ•œ ํŒจ์ปค๋ฅผ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•…์˜์ ์ถ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚น๋œ ์•…์„ฑ์ฝ”๋“œ์˜ ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ด€๊ณ„๋กœ ์—ฐ๊ตฌ์›๊ณผ ์•…์„ฑ์ฝ”๋“œ ๋ถ„์„์ž๋“ค์€ ๋ถ„์„์„ ์œ„ํ•ด์„œ ์–ธํŒฉ ๊ธฐ์ˆ ์„ ๋ฐœ์ ‚์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ‚์ด ํ๋ฅด๋ฉด์„œ ๋ฆฌ๋ฒ„์„œ๋“ค์˜ ์„ฑ๊ณต์ ์ถ ์–ธํŒฉ์„ ๋ฐฉํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ์šฒ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์€ ๋Š์ž„์—†์ด ํŒจ์ปค์— ์ถ”๊ฐ€

๋˜์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๋ฒˆ ์ƒˆ๋กœ์šฒ ์•†ํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์ด ๊ฐœ๋ฐœ๋˜๋ฉด ๋ฆฌ๋ฒ„์„œ๋“ค์€ ๊ทธ ๊ธฐ์ˆ ์„ ์šฐํšŒ ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ํˆด์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ์ค‘์ ์€ ํŒจ์ปค์˜ ์ง‚๋ณด๋œ ์•†ํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ๊ณผ ํˆด์„ ์–ด๋–ป๊ฒŒ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ฌด๋ ฅํ•˜๊ฒŒ ๋งŠ๋“œ๋Š”์ง€์— ๋Œ€ํ•ด ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ

์–ด๋–ค ํŒจ์ปค๋“ค์€ ์‰ฝ๊ฒŒ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ฌด๋ ฅํ•˜๊ฒŒ ๋งŠ๋“ค ์ˆ˜ ์ž‡๋Š”๋ฐ ๊ทธ๋ž˜์„œ ๊ทธ ์•†ํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์€ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„

๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณดํ˜ธ๋œ ์ฝ”๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ํŠธ๋ ˆ์ด์‹ฑ ํ•˜๊ณ  ๋ถ„์„ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ๋กœ:

โ€ข๋ณดํ˜ธ๋œ ์ฝ”๋“œ์˜ ๋ถ€๋ถ„์ด ์šฐํšŒ๋  ๋ชฉ์ ์œผ๋กœ ๋คํ”„ ๋˜์–ด ์ž„ํฌํŠธ ํ…Œ์ด๋ธ” ๋ฆฌ๋นŒ๋”ฉ ํˆด๋กœ ํ›Œ๋ฅญํ•˜๊ฒŒ ์–ธํŒฉ์ด ๋ฉ๋‹ˆ๋‹ค.

โ€ข๋ณดํ˜ธ๋œ ์ฝ”๋“œ๋Š” ๋ฐฑ์‹ž ์ง€์› ์–ธํŒจํ‚น์˜ ๋ชฉ์ ์„ ์œ„ํ•ด์„œ ์ฒ ์ €ํžˆ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.

๋ถ€๊ฐ€์ ์œผ๋กœ, ์•Œ๋ ค์ง‚ ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์ด ์•…์„ฑ์ฝ”๋“œ์— ์ง์ ‘ ์‘์šฉ ๋˜ ์ž‡์„ ๋•Œ ์•…์„ฑ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ๋ฒ„์‹ฑ์—

๋Šฅ์ˆ™ํ•œ ๊ฒƒ๋„ ๊ฐ€์น˜๊ฐ€ ์ž‡์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” ๋ชจ๋“  ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ์ˆ ์„ ๋‚˜์—ดํ•˜์ง€ ์•Š์•˜๊ณ  ์•Œ๋ ค์ง‚ ํŒจ์ปค ๋“ค์˜ ์ท๋ฐ˜์ ์œผ๋กœ ์ต์ˆ™ํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šฒ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด

๋‚˜์™€์ž‡์Šต๋‹ˆ๋‹ค. ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ๊ณผ ๋ฆฌ๋ฒ„์‹ฑ์— ๋Œ€ํ•ด ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์€ ๋…์ž๋Š” ๋งˆ์ง€๋ง‰์žฅ์— ์ž‡๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ  ํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ•„์ž๋Š” ๋…์ž๋“ค์ด ์ด ๋ฌธ์„œ ์—์„œ ์œ ์šฉํ•œ ํŒ๊ณผ ํŠธ๋ฆญ์˜ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

ํ•ดํ”ผ ์–ธํŒจํ‚น !

Page 4: [The Art of Unpacking]

4 | ํŽ˜ ์ด ์ง€

2. TECHNIQUES : DEBUGGER DETECTION

์ด๋ฒˆ์žฅ์˜ ๊ธฐ์ˆ ๋“ค์€ ํŒจ์ปค๊ฐ€ ์‹œ์Šคํ…œ์—์„œ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์‚ฌ์šฉ์ค‘์ถ์ง€ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊ทธ ํ•˜๊ณ  ์ž‡๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋””๋ฒ„๊ฑฐ๋“ค์„ ์ฐพ์•„ ๋‚ด๋Š” ๊ธฐ์ˆ ์€ ๋งค์šฐ ๋‹จ์ˆšํ•œ(๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ช…ํ•œ) ์ฒดํฌ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ native API ๋“ค๊ณผ ์ปค๋„ ๊ฐ์ฒด์—์„œ

์ œ๊ณตํ•ด์ค๋‹ˆ๋‹ค.

2.1 PEB.BeingDebugged Flag: IsDebuggerPresent()

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ถ ๋””๋ฒ„๊ฑฐ๋ฅผ ์ฐพ์•„ ๋‚ด๋Š” ๊ธฐ์ˆ ์€ Process Environment Block(PEB)์—์„œ BeingDebugged flag ๊ฐ€ ํฌํ•จ๋˜์–ด์ž‡๋Š”์ง€

๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. kernel32!IsDebuggerPresent() ๋Š” ์œ ์ €๋ชจ๋“œ์˜ ๋””๋ฒ„๊ฑฐ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ž‡๋Š”์ง€ flag ๊ฐ’์œผ๋กœ

ํ™•์ถํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” IsDebuggerPresent() ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰์ค‘์ถ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. Thread Environment Block(TEB) ์— ์ ‘๊ทผํ•˜์—ฌ

PEB ์˜ ์ฃผ์†Œ๋ฅผ ์–ป์€ ๋‹ค์Œ PEB ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  PEB + 0x02 ์œ„์น˜์˜ BeingDebugged flag ๋ฅผ ํ™•์ถํ•ฉ๋‹ˆ๋‹ค.

mov eax, large fs:18h

mov eax, [eax+30h]

movzx eax, byte ptr [eax+2]

retn

์ง์ ‘ IsDebuggerPresent()๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋Œ€์‹ž์— ์ท๋ถ€ ํŒจ์ปค ๋“ค์€ PEB ์˜ BeingDebugged flag ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด

๋ฆฌ๋ฒ„์„œ๋“ค์ด API ๋ฅผ ํŒจ์น˜ ํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์ž‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ์ฝ”๋“œ์—์„œ IsDebuggerPreset() ํ•จ์ˆ˜์™€ PEB.BeingDebugged flag ๊ฐ€ ๋””๋ฒ„๊ฑฐ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณผ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

; call kernel32!IsDebuggerPresent()

call [IsDebuggerPresent]

test eax,eax

jnz .debugger_found

; check PEB.BeingDebugged directly

mov eax,dword [fs:0x30] ;EAX = TEB.ProcessEnvironmentBlock

Page 5: [The Art of Unpacking]

5 | ํŽ˜ ์ด ์ง€

mobzx eax,byte [eax+0x02] ;AL = PEB.BeingDebugged

test eax,eax

jnz .debugger found

์ด ์ฒดํฌ๋“ค์€ ๋งค์šฐ ์ •ํ™• ํ•˜์—ฌ์„œ ํŒจ์ปค ๋“ค์€ ๋’ค์—์„œ ๋‚˜์˜ค๋Š” ์“ฐ๋ ˆ๊ธฐ์ฝ”๋“œ์™€ ์•†ํ‹ฐ ๋””์–ด์…ˆ๋ธ”๋ฆฌ ๊ธฐ์ˆ ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ด ๊ธฐ์ˆ ์€ PEB.BeingDebugged flag ๋ฅผ 0x00 ๊ฐ’์œผ๋กœ ํŒจ์น˜ ํ•˜์—ฌ ์›ํ™—ํ•˜๊ฒŒ ์šฐํšŒํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ์—์„œ PEB ๋ฅผ ๋ณด๋ ค๋ฉด

Ctrl+G(Goto Expression)์„ ๋ˆŒ๋ฅธ ๋’ค fs:[30] ์ด๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด ๋ณผ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

๋ถ€๊ฐ€์ ์œผ๋กœ๋Š” ์˜ฌ๋ฆฌ์Šคํฌ๋ฆฑํŠธ ๋ช…๋ น์–ด์ถ โ€œdbh" ๋Š” ์ด๊ฒƒ์„ ํŒจ์น˜ ํ•˜์—ฌ ์ค๋‹ˆ๋‹ค:

Dbh

๋งˆ์ง€๋ง‰์œผ๋กœ Olly Advanced ํ”Œ๋Ÿฌ๊ทธ์ถ์€ ์˜ต์…˜์—์„œ BeingDebugged field ๋ฅผ 0 ์œผ๋กœ ์„ธํŒ… ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2.2 PEB.NtGlobalFlag, Heap.HeapFlags, Heap.ForceFlags

PEB.NtGlobalFlag. PEB ์˜ ๋˜ ๋‹ค๋ฅธ ํ•„๋“œ์ถ NtGlobalFlag(offset 0x68)๋Š” ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋กœ๋“œ ๋˜์–ด ์ž‡๋Š”์ง€ ๊ฐ์ง€ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋””๋ฒ„๊น…์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด NtGlobalFlag ํ•„๋“œ ๊ฐ’์€ 0x0 ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋””๋ฒ„๊ทธ ์ค‘์ด๋ผ๋ฉด ํ•„๋“œ ๊ฐ’์€ 0x70 ์ด

๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ํ”Œ๋ž˜๊ทธ๋“ค์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

โ€ข FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

โ€ข FLG_HEAP_ENABLE_FREE_CHECK (0x20)

โ€ข FLG_HEAP_VALIDATE_PARAMETERS (0x40)

์ด ํ”Œ๋ž˜๊ทธ ๋Š” ntdll!LdrpInitializeExecutionOptions() ์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ €์žฅ๋œ PEB.NtGlobalFlag ๋Š” gflags.exe ํˆด์ด๋‚˜ ๋‹ค์Œ์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌํ‚ค๋กœ ๋ฌด์‹œ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

Heap Flags. NtGlobalFlag ์˜ ์„ค์ •์œผ๋กœ ์ถํ•ด์„œ ๋ช‡ ๊ฐœ์˜ ํ”Œ๋ž˜๊ทธ ๊ฐ’๋“ค์ด ํ™—์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ntdll!RtlCreateHeap()

ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ™•์ถํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ์˜ ์ฒซ ๋ฒˆ์งธ heap ์ด ์ƒ์„ฑ๋  ๋•Œ ํ”Œ๋ž˜๊ทธ๋“ค ๊ณผ ForceFlags ํ•„๋“œ๋ฅผ 0x02

(HEAP_GROWABLE) ๊ทธ๋ฆฌ๊ณ  0x0 ์œผ๋กœ ์„ค์ • ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋””๋ฒ„๊น…์ค‘ ์ท๋•Œ๋Š” ์ด ํ”Œ๋ž˜๊ทธ๋“ค์€ 0x50000062

Page 6: [The Art of Unpacking]

6 | ํŽ˜ ์ด ์ง€

(NtGlobalFlag ์— ๋”ฐ๋ผ) ์™€ 0x4000060 (ํ”Œ๋ž˜๊ทธ๋“ค๊ณผ 0x6001007D ์— ๋”ฐ๋ผ) ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋””๋ฒ„๊ทธ ๋ 

๋•Œ heap ์ด ๋งŠ๋“ค์–ด์ง€๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

โ€ข HEAP_TAIL_CHECKING_ENABLED (0x20)

โ€ข HEAP_FREE_CHECKING_ENABLED (0x40)

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” PEB.NtGlobalFlag ๊ฐ€ 0 ์ด ์•„๋‹ˆ๊ณ  ํ”„๋กœ์„ธ์„œ(PEB.ProcessHeap)์˜ ์ฒซ๋ฒˆ์งธ heap ์ด ์ƒ์„ฑ๋  ๋•Œ ํ”Œ๋ž˜๊ทธ๋“ค์ด

์„ค์ • ๋˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.:

;ebx = PEB

mov edx,[fs:0x30]

;Check if PEB.NtGlobalFlag != 0

cmp dword [ebx+0x68],0

jne .debugger_found

;eax = PEB.ProcessHeap

mov eax,[ebx+0x18]

;Check PEB.ProcessHeap.Flags

cmp dword [eax+0x0c],2

jne .debugger_found

;Check PEB.ProcessHeap.ForceFlags

cmp dword [eax+0x10],0

jne .debugger_found

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ด ๊ฒƒ์€ PEB.NtGlobalFlag ์™€ PEB.HeapProcess ํ”Œ๋ž˜๊ทธ ๋“ค์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น… ์ค‘์ด ์•„๋‹Œ๊ฒƒ ์ฒ˜๋Ÿผ ํŒจ์น˜ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์˜ฌ๋ฆฌ์Šคํฌ๋ฆฑํŠธ๋กœ ํŒจ์น˜ ํ•  ๋• ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•ฉ๋‹ˆ๋‹ค:

Page 7: [The Art of Unpacking]

7 | ํŽ˜ ์ด ์ง€

var peb

var patch_addr

var process_heap

//PEB ์—๋Š” ํ•˜๋“œ์ฝ”๋“œ๋œ TEB ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (first thread: 0x7ffed000)

mov peb,[7ffde000+30]

//PEB.NtGlobalFlag ๋ฅผ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค

lea patch_addr,[peb+68]

mov [patch_addr],0

//PEB.ProcessHeap.Flags/ForceFlags ๋ฅผ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค.

mov process_heap,[peb+18]

lea patch_addr,[process_heap+0c]

mov [patche_addr],2

lea patch_addr,[process_heap+10]

mov [patch_addr],0

๋˜ํ•œ, Olly Advanced ํ”Œ๋Ÿฌ๊ทธ์ถ ์˜ต์…˜์—์„œ PEB.NtGlobalFlags ์™€ PEB.ProcessHeap ํ”Œ๋ž˜๊ทธ๋“ค์„ ์…‹ํŒ… ํ•ด์ค˜๋„ ๋ฉ๋‹ˆ๋‹ค.

2.3 DebugPort: CheckRemoteDebuggerPresent() / NtQueryInformationProcess()

Kernel32!CheckRemoteDebuggerPresent() ๋Š” ๋””๋ฒ„๊ฑฐ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ดํƒœ์น˜ ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด API ์—์„œ

ntdll!NtQueryInformationProcess() ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ถˆ๋Ÿฌ๋‚ผ ๋•Œ ProcessInformationClass ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ProcessDebugPort(7)์ด

๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ NtQueryInformationProcess() ํ•จ์ˆ˜๋Š” ์ปค๋„๊ตฌ์กฐ์ฒด์ถ EPROCESS ์˜ DebugPort ์˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

์œ ์ €๋ชจ๋“œ์˜ ๋””๋ฒ„๊ฑฐ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น… ์ค‘์ท ๋•Œ ๋Š” DebugPort ํ•„๋“œ์— 0 ์ด ์•„๋‹Œ๊ฐ’ ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—

ProcessInformation ์˜ ๊ฐ’์ด 0xFFFFFFFF ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” PorcessInformation ์€ 0 ์ด ๋ฉ๋‹ˆ๋‹ค.

Page 8: [The Art of Unpacking]

8 | ํŽ˜ ์ด ์ง€

Kernel32!CheckRemoteDebuggerPresent() ํ•จ์ˆ˜๋Š” 2 ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ถ€์šณ๋ณ€์ˆ˜์˜ ํฌ์ถํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊ทธ์ค‘ ์ท ๋• ์ฐธ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

BOOL CheckRemoteDebuggerPresent(

HANDLE hProcess,

PBOOL pbDebuggerPresent

)

Ntdll!NtQueryInformationProcess() ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” 5 ๊ฐœ์˜ ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋””๋ฒ„๊ฑฐ๋ฅผ ๋””ํ…ํŒ… ํ•˜๊ธฐ ์œ„ํ•ด PorcessInformationClass ๋Š” ProcessDebugPort(7)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

NTSTATUS NTAPI NtQueryInformationProcess(

HANDLE ProcessHanle,

PROCESSINFOCLASS ProcessInformationClass,

PVOID ProcessInfomation,

ULONG ProcessInformationLength,

PULONG ReturnLength

)

์˜ˆ์ œ

CheckRemoteDebuggerPresent() ํ•จ์ˆ˜์™€ NtQueryInformation() ํ•จ์ˆ˜ ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น… ์ค‘์ท ๋•Œ

๋ณด์—ฌ์ง€๋Š” ์ ‚ํ˜•์ ์ถ ์ฝœ์ž…๋‹ˆ๋‹ค.

; using kernel32!CheckRemoteDebuggerPresent()

lea eax,[.bDebuggerPresent]

push eax ;pbDebuggerPresent

push 0xffffffff ;hProcess

call [CheckRemoteDebuggerPresent]

cmp dword [.bDebuggerPresent],0

jne .debugger_found

Page 9: [The Art of Unpacking]

9 | ํŽ˜ ์ด ์ง€

; using ntdll!NtQueryInformationProcess(ProcessDebugPort)

lea eax,[.dwReturnLen]

push eax ;Returnlength

push 4 ;ProcessInformationLength

lea eax,[.dwDebugPort]

push eax ;ProcessInformation

push ProcessDebugPort ;ProcessInformationClass (7)

push 0xffffffff ;ProcessHandle

call [NtQueryInformationProcess]

cmp dword [.dwDebugPort],0

jne .debugger_found

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ NtQueryInformationProcess() ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด ๋˜๋Š” ๊ณณ ์—์„œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ์ž‘๋™ํ• 

๋•Œ ProcessInformation ์€ DWORD ๊ฐ’์„ 0 ์œผ๋กœ ํŒจ์น˜ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์˜ฌ๋ฆฌ์Šคํฌ๋ฆฑํŠธ์˜ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

var bp_NtQueryInformationProcess

// set a breakpoint handler

eob bp_handler_NtQueryInformationProcess

// set a breakpoint where NtQueryInformationProcess returns

qpa "NtQueryInformationProcess", "ntdll.dll"

find $RESULT, #c21400# //retn 14

mov bp_NtQueryInformationProcess,$RESULT

bphws bp_NtQueryInformationProcess,"x"

run

bp_handler_NyQueryInformationProcess:

Page 10: [The Art of Unpacking]

10 | ํŽ˜ ์ด ์ง€

//ProcessInformationClass == ProcessDebugPort?

cmp [esp+8], 7

jne bp_handler_ntQueryInformationProcess_continue

//patch ProcessInformation to 0

mov patch_addr, [esp+c]

mov [patch_addr], 0

//clear breakpoint

bphwc bp_NtQueryInformationProcess

bp_handler_NtQueryInformationProcess_continue:

run

Olly Advanced ํ”Œ๋Ÿฌ๊ทธ์ถ์€ NtQueryInformationProcess()๋ฅผ ํŒจ์น˜ ํ•˜๋Š” ์˜ต์…˜์„ ๊ฐ–๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค.

์ด ํŒจ์น˜๋Š” NtQueryInformationProcess() ์˜ ๋ฆฌํ„ด ๊ฐ’์„ ์กฐ์ž‘ํ•˜์—ฌ ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

2.4 Debugger Interrupts

์ด ๊ธฐ์ˆ ์€ ๋””๋ฒ„๊ฑฐ ์—์„œ INT3 ์™€ INT1 ๋ช…๋ น์–ด๋ฅผ ์ง€๋‚˜๊ฐˆ ๋•Œ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์ด๋Ÿฐ ์ค‘๋‹จ์ ์„ ๊ทธ๋ƒฅ ์ง€๋‚˜ ๊ฐˆ์ˆ˜ ์ž‡๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ

์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Debugger Interrupts ๋Š” ๋ฐ”๋กœ ์ด๋Ÿฐ ์‚ฌ์‹ค์„ ์ด์šฉํ•˜๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค. ํŒจ์ปค๊ฐ€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์•†์—์„œ

ํ”Œ๋ž˜๊ทธ๋“ค์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋ž˜๊ทธ๊ฐ€ INT ๋ช…๋ น ์ดํ›„์— ์„ค์ • ๋˜์–ด์ž‡์ง€ ์•Š๋‹ค๋ฉด ์ด๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น…์ค‘ ์ด๋ผ๋Š” ๊ฒƒ์„

์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ kernel32!DebugBreak() ๋‚ด๋ถ€์—์„œ INT3 ์„ ๋‹ด๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡๋ช‡ ํŒจ์ปค๋Š” ์ด API ๋ฅผ ๋Œ€์‹ž

์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์ด ์˜ˆ์ œ๋Š” EAX ๋ฅผ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์•†์—์„œ 0xFFFFFFFF(CONTEXT ๋ ˆ์ฝ”๋“œ์— ์˜ํ•˜์—ฌ) ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์•†์—์„œ

๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค:

;set exception handler

push .exception_handler

Page 11: [The Art of Unpacking]

11 | ํŽ˜ ์ด ์ง€

push dword [fs:0]

mov [fs:0], esp

;reset flag (eax) invoke int3

xor eax,eax

int3

;restore exception handler

pop dword [fs:0]

add esp,4

;check if the flag had been set

test eax,eax

je .debugger_found

:::

.exception_handler:

;EAX = ContextRecord

mov eax, [esp+0xc]

;set flag (ContextRecord,EAX)

mov dword [eax+0xb0],0xffffffff

;set ContextRecord.EIP

inc dword [eax+0xb8]

xor eax,eax

retn

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ์—์„œ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๊ทธ๋ƒฅ ์‹คํ–‰ํ•˜๋˜ ๋„์ค‘์— ๋””๋ฒ„๊ฑฐ๊ฐ€ ์ถํ„ฐ๋ŸฝํŠธ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋ฉด ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Page 12: [The Art of Unpacking]

12 | ํŽ˜ ์ด ์ง€

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ์— ๊ฑธ๋ ธ์„ ๋•Œ ์˜ˆ์™ธ ํ•ธ๋“ค์„ ํ™•์ถํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์ฃผ์†Œ(via View -> SEH Chain)๋ฅผ ์‹๋ณ„ ํ•œ ๋’ค Shift+F9 ๋ฅผ

๋ˆŒ๋Ÿฌ์„œ ๋””๋ฒ„๊ฑฐ ์ถํ„ฐ๋ŸฝํŠธ/์˜ˆ์™ธ ๋ฅผ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ณด๋‚ด์ง€๋ฉด ๊ณ„์† ํŠธ๋ ˆ์ด์‹ฑ ํ•  ์ˆ˜ ์ž‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋””๋ฒ„๊ฑฐ ์ถํ„ฐ๋ŸฝํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ์—์„œ Option -> Debugging

Options -> Exceptions -> "Ignore Following exceptions" ๊ทธ๋ฆฌ๊ณ  โ€œINT 3 Breaks" ๊ทธ๋ฆฌ๊ณ  โ€Single-step break" ๋ฅผ ์ฒดํฌํ•ด์ค๋‹ˆ๋‹ค.

2.5 Timing Checks

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น… ์ค‘์ท ๋•Œ ๋””๋ฒ„๊ฑฐ์˜ ์ด๋ฒขํŠธ ํ•ธ๋“ค๋ง์ฝ”๋“œ, ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ, ๋ช…๋ น๋“ฑ์ด CPU ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๋“ค์ด ๋‹จ๊ณ„๋ณ„๋กœ

๋ช…๋ น์–ด๋ฅผ ์ง€๋‚˜๊ฐˆ ๋•Œ ํŒจ์ปค ๋“ค์€ ๋ช‡ ๊ฐœ์˜ ๋ช…๋ น์–ด ์‚ฌ์ด์—์„œ ์‚ฌ์šฉ ๋˜์–ด์ง€๋Š” ์‹œ๊ฐ‚์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ท๋ฐ˜์ ์ถ ์‹คํ–‰๋ณด๋‹ค ์‚ฌ์šฉ์‹œ๊ฐ‚์ด

๋” ๊ธธ๋‹ค๋ฉด ๋””๋ฒ„๊ฑฐ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์ค‘ ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์˜ ๊ฐ‚๋‹จํ•œ ์˜ˆ์ œ๋Š” ์‹œ๊ฐ‚์„ ์ฒดํฌํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RDTSC(Read Time-Stamp Counter)๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ธฐ ์ ‚๊ณผ ๋ช‡ ๊ฐœ์˜

๋ช…๋ น์„ ์‹คํ–‰ ํ•œ ๋’ค์— ์ฆ๊ฐ€๋Ÿ‰์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ๊ฐ€๋Ÿ‰๊ฐ’ 0x200 ์€ ๋‘ ๊ฐœ์˜ RDTSC ๋ช…๋ น์ด ์‹คํ–‰๋  ๋•Œ ์‹คํ–‰๋Ÿ‰ ์—

๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

Rdtsc

mov ecx,eax

mov ebx,edx

; ... more instructions

nop

push eax

pop eax

Page 13: [The Art of Unpacking]

13 | ํŽ˜ ์ด ์ง€

nop

; ... more instructions

;compute delta between RDTSC instructions

rdtsc

;Check high order bits

cmp edx,ebx

ja .debugger_found

;Check low order bits

sub eax,ecx

cmp eax,0x200

ja .debugger_found

์‹œ๊ฐ‚์ฒดํฌ๋Š” kernel32!GetTickCount() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ TickCountLow ์˜ ๊ฐ’๊ณผ

TickCoutMultiplier ํ•„๋“œ์˜ SharedUserData ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ๋Š” ํ•ญ์ƒ 0x7FFE0000 ์ถ ๊ฒƒ์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๋ ˆ๊ธฐ์ฝ”๋“œ์™€ ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธฐ๊ณ  RDTSC ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ์ฐพ๊ธฐ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐ‚์ฒดํฌ๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ํŠธ๋ ˆ์ด์‹ฑํ•˜์—ฌ ์šฐํšŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๋Š” ์ฆ๊ฐ€๋Ÿ‰์ฝ”๋“œ๋ฅผ ๋น„๊ต ํ•˜๊ธฐ ์ ‚์—

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ๊ณ  ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ๊ฑธ๋ฆฏ ๋•Œ๊นŒ์ง€ ํŠธ๋ ˆ์ด์‹ฑ ํ•ฉ๋‹ˆ๋‹ค. ์ด์™ธ์—๋„ GetTickCount() ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฆฌํ„ด๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

Olly Advanced ๋ฅผ ์ด์šฉํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• - ์ปค๋„๋ชจ๋“œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ถ์Šคํ†จํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค:

1. control register CR4 ์•†์˜ Time Stamp Disable Bit(TSD)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. RDTSC ๋ช…๋ น์ด ring 0 ๊ฐ€ ์•„๋‹ ๋•Œ ์‹คํ–‰ํ•˜์—ฌ ๋น„ํŠธ๊ฐ€

์„ค์ •๋˜๋ฉด General Protection (GP) ์˜ˆ์™ธ๊ฐ€ ์œ ๋ฐœ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Page 14: [The Art of Unpacking]

14 | ํŽ˜ ์ด ์ง€

2. Interrupt Descriptor Table (IDT) ๊ฐ€ GP ์˜ˆ์™ธ๋ฅผ ํ›„ํ‚น ํ•˜๊ฑฐ๋‚˜ RTDSC ํ•„ํ„ฐ๋ง์„ ํ•ด์„œ ์‹คํ–‰ํ•˜๊ฒŒ ์„ค์ • ํ•ฉ๋‹ˆ๋‹ค. GP ๋ฅผ ํ›„ํ‚น

ํ–ˆ๋‹ค๋ฉด ๋‹จ์ง€ ๋ฆฌํ„ด๊ฐ’ ์— 1 ์„ ๋”ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์— ๋ถˆ์•†์ •์„ฑ์„ ์ดˆ๋ž˜ํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋“œ๋ผ์ด๋ฒ„๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ virtual machine ์ด๋‚˜ ๋ถ€์…”์ ธ๋„ ๋˜๋Š”

์‹œ์Šคํ…œ์—์„œ ํ•ญ์ƒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด์•ผ ๋ฉ๋‹ˆ๋‹ค.

2.6 SeDebugPrivilege

๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” SeDebugPrivilege ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋‚˜ WinDbg ์— ์˜ํ•ด ๋ถˆ๋Ÿฌ์™€ ์ง‚๋‹ค๋ฉด

SeDebugPrivilege ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ SeDebugPrivilege ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡๊ฒŒ ๋˜๊ณ 

SeDebugPrivilege ๊ถŒํ•œ์€ ์ƒ์† ๋ฉ๋‹ˆ๋‹ค.

์ท๋ถ€ ํŒจ์ปค ๋“ค์€ CSRSS.EXE ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋””๋ฒ„๊น… ์ค‘์ถ์ง€๋ฅผ ๊ฐ‚์ ‘์ ์œผ๋กœ SeDebugPrivilege ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ถํ•ฉ๋‹ˆ๋‹ค.

CSRSS.EXE ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ด์ˆ˜ ์ž‡๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” SeDebugPrivilege ๊ถŒํ•œ์ด ์ž‡์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น…์ค‘์ถ

๊ฒƒ์„ ์•Œ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด ์ฒดํฌ๋ฐฉ๋ฒ•์€ ๋ณด์•† ๋””์Šคํฌ๋ฆฑํ„ฐ ์ถ CSRSS.EXE ํ”„๋กœ์„ธ์Šค๋Š” ์˜ค์ง ์‹œ์Šคํ…œ๊ถŒํ•œ๋งŠ์ด ์—‘์„ธ์Šค ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŠ์•ฝ SeDebugPrivilege ๊ถŒํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ–๊ณ  ์ž‡๋‹ค๋ฉด ๋ณด์•† ๋””์Šคํฌ๋ฆฑํ„ฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜

์ž‡์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ถ Administrators ๊ทธ๋ฃน์˜ ๋งด๋ฒ„ ๋“ค์€ ํŠน๋ณ„๊ถŒํ•œ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜๋Š” ์˜ˆ์ œ ์ฒดํฌ์ž…๋‹ˆ๋‹ค:

;query for the PID of CSRSS.EXE

call [CsrGetProcessId]

;try to open the CSRSS.EXE process

push eax

push FALSE

push PROCESS_QUERY_INFORMATION

call [OpenProcess]

;if OpenProcess() was successful,

Page 15: [The Art of Unpacking]

15 | ํŽ˜ ์ด ์ง€

; process is probably being debugged

test eax,eax

jnz .debugger_found

์ด ์ฒดํฌ๋Š” CSRSS.EXE ์˜ PID ๋ฅผ ntdll!CsGetProcessId() API ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจ์ปค๋Š” ์ˆ˜๋™์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ

์—ด๊ฑฐํ•˜์—ฌ CSRSS.EXE ์˜ PID ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. OpenProcess() ๊ฐ€ ์„ฑ๊ณตํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ SeDebugPrivilege ๊ถŒํ•œ์ด ์“ฐ์—ฌ์ง€๊ณ  ์ž‡์Œ์„

์˜๋ฏธํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ntdll!NtOpenProcess() ๊ฐ€ ๋ฆฌํ„ด ๋  ๋•Œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์€ ๋’ค ์‹คํ–‰์„ ํ•˜์—ฌ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด

EAX ๊ฐ’์„ 0xC0000022 (STATUS_ACCESS_DENIED) ๋กœ ์„ค์ • ํ•ด์ค๋‹ˆ๋‹ค.

2.7 Parent Process

์ ‚ํ˜•์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ explorer.exe(๋”๋ธ”ํด๋ฆญ ํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์„ ๋•Œ)์ท ๋•Œ ๋ถ€๋ชจํ”„๋กœ์„ธ์Šค๊ฐ€ explorer.exe ๊ฐ€

์•„๋‹ˆ๊ณ  ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒ์„ฑ๋œ ๊ฒƒ ์ท ๋•Œ ์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์ค‘์ท ๊ฐ€๋Šฅ์„ฑ์ด ์ž‡์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์ด๋Ÿฐ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค..

1. TEB(TEB.ClientId) ๋˜๋Š” GetCurrentProcessId()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ current process ์˜ PID ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

2. Process32First/Next() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ป์–ด explorer.exe PID (PROCESSENTRY32.szExeFile ์„

ํ†ตํ•˜์—ฌ)์™€ ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋Š” PROCESSENTRY32.th32ParentProcessID ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ PID ๋ฅผ ์–ป์–ด

๊ธฐ๋กํ•ด๋‘ก๋‹ˆ๋‹ค.

3. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ PID ๊ฐ€ explorer.exe ์˜ PID ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํƒ€๊ฒŸ ์€ ๋””๋ฒ„๊น…์ค‘์ท ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋””๋ฒ„๊ฑฐ ์ฒดํฌ๋Š” cmd ๋˜๋Š” ๋‹ค๋ฅธ์‰˜์„ ํ†ตํ•˜์—ฌ ํŒจ์ปค๊ฐ€ ์‹คํ–‰ ์ค‘ ์ท๋• ์˜ค๋ฅ˜๋ฅผ ์ท์œผํ‚ฌ ์ˆ˜ ์ž‡์Œ์„ ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

Olly Advanced ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Process32Next()๋ฅผ ๊ณ„์† fail ์„ ๋ฆฌํ„ด ํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ํŒจ์ปค์˜ ํ”„๋กœ์„ธ์Šค ์—ด๊ฑฐ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•˜์—ฌ PID ์ฒดํฌ๋ฅผ ์ ํ”„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Page 16: [The Art of Unpacking]

16 | ํŽ˜ ์ด ์ง€

์ด๊ฒƒ์€ kernel32!Process32NextW()์˜ ์—”ํŠธ๋ฆฌ ๋ถ€๋ถ„์„ EAX ๊ฐ’์„ 0 ์œผ๋กœ ํ•œ ๋‹ค์Œ ๋ฐ”๋กœ ๋ฆฌํ„ด ํ•˜๊ฒŒ ํŒจ์น˜ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2.8 DebugObject: NtQueryObject()

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น…์ค‘์ถ์ง€ ํ™•์ถํ•˜๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹ž ์‹œ์Šคํ…œ์—์„œ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์ž‘๋™์ค‘์ท ๋•Œ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ฒดํฌํ•˜์—ฌ ๋””๋ฒ„๊ฑฐ๊ฐ€

์‹คํ–‰์ค‘์ถ์ง€ ํ™•์ถํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋ฒ„์‹ฑ ํฌ๋Ÿผ์—์„œ ํ•œ๊ฐ€์ง€ ์žฌ๋ฏธ์ž‡๋Š” ๋ฐฉ๋ฒ•์ด ๋…ผ์˜ ๋์Šต๋‹ˆ๋‹ค.. DebugObject ํƒ€์ž…์˜ ์ปค๋„ ๊ฐ์ฒด์˜ ๋ฒˆํ˜ธ๋กœ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—

๋Œ€ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋””๋ฒ„๊น…์ค‘์ถ์ง€ ๊ณ„์†ํ•ด์„œ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…์ค‘์—๋Š” ์ปค๋„ ์•†์—์„œ DebugObject ํƒ€์ž…์˜

ํ•œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

DebugObject ์˜ ๋ฒˆํ˜ธ๋Š” ntdll!NtQueryObject() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฐ์ฒด์˜ ํƒ€์ž…์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

NtQueryObject ๋Š” 5 ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์งˆ์˜ํ•˜๊ธฐ์œ„ํ•ด ObjectHandle ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” NULL

๋กœ ์„ค์ •๋˜๊ณ  ObjectInformationClass ๋Š” ObjecetAllTypeInformation(3)์ž…๋‹ˆ๋‹ค:

NTSTATUS NTAPI NtQueryObject(

HANDLE ObjectHandle,

OBJECT_INFORMATION_CLASS objectInformationClass,

PVOID objectInformation,

ULONG Length,

PULONG ResultLength

)

API ๊ฐ€ ๋ฆฌํ„ด ๋  ๋•Œ OBJECT_ALL_INFORMATION ๊ตฌ์กฐ์ฒด ์•†์—์„œ NumberOfObjectsTypes ํ•„๋“œ๋Š” ObjectTypeInformation ๋ฐฐ์—ด์˜

์ด ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

typedef struct _OBJECT_ALL_INFORMATION {

ULONG NumberOfObjectsTypes;

OBJECT_TYPE_INFORMATION objectTypeInformation[1];

์ด ํƒ์ง€ ๋ฃจํ‹ด์€ ObjectTypeInformation ๋ฐฐ์—ด์˜ ๊ตฌ์กฐ์ฒด๋ฅผ

Page 17: [The Art of Unpacking]

17 | ํŽ˜ ์ด ์ง€

typedef struct _OBJECT_TYPE_INFORMATION {

[00] UNICODE_STRING TypeName;

[08] ULONG TotalNumberOfHandles;

[0c] ULONG TotalNumberOfObjects;

... more fields ...

}

TypeName ํ•„๋“œ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ์ŠคํŠธ๋ง โ€œDebugObject"๋ฅผ ๋น„๊ตํ•  ๋•Œ TotalNumberOfObject ๋˜๋Š” TotalNumberHandles ํ•„๋“œ์˜

๊ฐ’์ด 0 ์ด ์•„๋‹Œ์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

NtQueryInformationProcess() ํ•ด๊ฒฐ๋ฒ•๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. NtQueryObject() ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ด ํ•˜๋Š” ๊ณณ ์—์„œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด ์ค„์ˆ˜

์ž‡์Šต๋‹ˆ๋‹ค. OBJECT_ALL_INFORMATION ๊ตฌ์กฐ์ฒด๊ฐ€ ๋ฆฌํ„ด ๋  ๋•Œ ํŒจ์น˜ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. NumberOfObjectsTypes ํ•„๋“œ๊ฐ€ 0 ์œผ๋กœ

์„ค์ •ํ•˜์—ฌ ํŠน๋ณ„ํ•˜๊ฒŒ ObjectTypeInformation ๋ฐฐ์—ด์„ ํ†ตํ•ด ํŒจ์ปค๊ฐ€ ์ˆ˜์ • ํ•˜๋Š” ๊ฒƒ ์„ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

NtQueryInformationProcess() ์™€ ๋น„์Šทํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์˜ฌ๋ฆฌ์Šคํฌ๋ฆฑํŠธ๋ฅผ ๋งŠ๋“ค์–ด ์ด ๊ฒƒ์„ ํ•  ์ˆ˜๋„ ์ž‡์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๊ฒƒ์œผ๋กœ๋Š” Olly advanced ํ”Œ๋Ÿฌ๊ทธ์ถ์œผ๋กœ NtQueryObject() API ํ•จ์ˆ˜์— ์ฝ”๋“œ๋ฅผ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์ž‡๋‹ค.

ObjectAllTypeInformation ํƒ€์ž…์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฒ„ํผ์—์„œ ๋ฆฌํ„ด ๋  ๋•Œ ํ•ญ์ƒ 0 ์ด ๋˜๋„๋ก ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

2.9 Debugger Window

์‹œ์Šคํ…œ์—์„œ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์‹คํ–‰์ค‘์ถ์ง€ ๊ธฐ๋กํ•˜์—ฌ ํ™•์ถํ•˜๋Š” ๋””๋ฒ„๊ฑฐ ์œˆ๋„์šฐ ๊ฐ€ ์ž‡์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ ์œˆ๋„์šฐ๋Š” ํŠน๋ณ„ํ•œ ์ด๋ฆ„์„

์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.(OLLYDBG for OllyDbg,WinDbgFrameClass for WinDbg) ์ด ๋””๋ฒ„๊ฑฐ ์œˆ๋„์šฐ๋Š” user32!FindWindow() ๋‚˜

user32!FindWindwEx() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ™•์ถํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ์ฝ”๋“œ๋Š” FindWindow() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ๋‚˜ WinDbg ๊ฐ€ ์‹œ์Šคํ…œ์—์„œ ์œˆ๋„์šฐ๋ฅผ ๋งŠ๋“ค์–ด๋ƒˆ๋Š”์ง€ ํ™•์ถํ•ฉ๋‹ˆ๋‹ค.

push NULL

push .szWindowClassOllyDbg

Page 18: [The Art of Unpacking]

18 | ํŽ˜ ์ด ์ง€

call [FindWindowA]

test eax,eax

jnz .debugger_found

push NULL

push .szWindowClassWinDbg

call [FindWindowA]

test eax.eax

jnz .debugger_found

.szWindowClassOllyDbg db "OLLYDBG",0

.szWindowClassWinDbg db "WinDbgFrameClass",0

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ FindWindow()/FindWindowEx() ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ๋•Œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด์ค๋‹ˆ๋‹ค. ์‹คํ–‰ํ•˜์—ฌ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€

๊ฑธ๋ฆฏ ๋•Œ lpClassNmae ์˜ ์ŠคํŠธ๋ง ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. ๋˜ ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋ฆฌํ„ด๊ฐ’์„ NULL ๋กœ ์…‹ํŒ… ํ•ด์ค๋‹ˆ๋‹ค.

2.10 Debugger Process

์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰์ค‘์ถ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ™•์ถํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์ค‘์—์„œ ๋””๋ฒ„๊ฑฐ( ์˜ˆ๋ฅผ๋“ค์–ด OLLYDBG.EXE,

windbg.exe, ๊ธฐํƒ€๋“ฑ๋“ฑ)ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฆ„์„ ์ฒดํฌํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. Process32First/Next()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์‹คํ–‰ ์ค‘์ท ๋•Œ

ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์„ ํ™•์ถํ•˜์—ฌ ์ง์ ‘ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ช‡๋ช‡ ํŒจ์ปค ๋“ค์€ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ kernel32!ReadProcessMemory() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊ฑฐ์™€ ๊ด€๊ณ„ ์ž‡๋Š” ๋ฌธ์ž์—ด( ์˜ˆ๋ฅผ ๋“ค์–ด

"OLLYDBG")์„ ์ฐพ์„ ๋•Œ ๋ฆฌ๋ฒ„์„œ๋“ค์€ ์‹คํ–‰์ค‘์ถ ๋””๋ฒ„๊ฑฐ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์„ ๋•Œ ํŒจ์ปค๋Š” ํ™”๋ฉด์— ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ

๋„์šฐ๊ณ  ์กฐ์šฉํžˆ ๋๋‚ด๊ฑฐ๋‚˜ ๋””๋ฒ„๊ฑฐ๋ฅผ ์ข…๋ฃŒ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

Page 19: [The Art of Unpacking]

19 | ํŽ˜ ์ด ์ง€

๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ kernel32!Process32NextW() ํ•จ์ˆ˜์—์„œ ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ด๊ฑฐํ•˜๋Š”

๊ฒƒ์„ ์‹คํŒจํ•˜๊ฒŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2.11 Device Drivers

๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ํ™—์„ฑํ™”๋œ ์ปค๋„๋ชจ๋“œ์˜ ๋””๋ฒ„๊ฑฐ๋ฅผ ์ฐพ์•„ ๋‚ด๋Š” ๊ณ ์ ‚์ ์ถ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด

๊ธฐ์ˆ ์€ ์•„์ฃผ ๋‹จ์ˆšํ•ฉ๋‹ˆ๋‹ค. kernel32!CrateFile() ํ•จ์ˆ˜๊ฐ€ ๋ถˆ๋Ÿฌ์™€์งˆ ๋•Œ ์ปค๋„๋ชจ๋“œ ๋””๋ฒ„๊ฑฐ์ถ SoftICE ๋Š” ์ž˜ ์•Œ๋ ค์ง‚ ๋””๋ฐ”์ด์Šค ์ด๋ฆ„๋“ค์„

์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

๋‹จ์ˆšํ•œ ์ฒดํฌ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:

push NULL

push 0

push OPEN_EXITSTING

push NULL

push FILE_SHARE_READ

push GENERIC_READ

push .szDeviceNameNtice

call [CreateFileA]

cmp eax,INVALID_HANDLE_VALUE

jne .debugger_found

.szDeviceNameNtice db "\\.\NTICE",0

์ท๋ถ€ ๋ฒ„์ ‚์˜ SoftICE ๋Š” ๋””๋ฐ”์ด์Šค ์ด๋ฆ„์— ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฒดํฌ๋ฅผ ์‹คํŒจํ•˜๊ฒŒ ๋งŠ๋“ญ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์‹ฑ ํฌ๋Ÿผ์—์„œ ๋ถ€๋ฅดํŠธํฌ์‹ฑ์„ ํ•˜์—ฌ

๋””๋ฐ”์ด์Šค์˜ ์ด๋ฆ„์„ ์ฐพ์•„ ๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์–˜๊ธฐ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ๋กœ์šฒ ํŒจ์ปค๋“ค์€ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ฐพ์•„ ๋‚ด๋Š” ๊ธฐ์ˆ ์„

์ด์šฉํ•˜์—ฌ Regmon ์ด๋‚˜ Filemon ๊ฐ™์€ ์‹œ์Šคํ…œ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด๋„ ์ฐพ์•„ ๋ƒ…๋‹ˆ๋‹ค.

Page 20: [The Art of Unpacking]

20 | ํŽ˜ ์ด ์ง€

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๊ฐ‚๋‹จํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ kernel32!CreateFileFileW() ํ•จ์ˆ˜ ์•†์—์„œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์€ ๋’ค, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€

๊ฑธ๋ฆฌ๋ฉด ํŒŒ์ท์ด๋ฆ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ฑฐ๋‚˜ INVALID_HANDLE_VALUE (0xFFFFFFFF) ์œผ๋กœ ๋ฆฌํ„ด๊ฐ’์„ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2.12 OllyDbg:Guard Pages

์ด ๊ฒ€์‚ฌ๋Š” ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋งŠ์„ ์ฒดํฌํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— on-access/write ๋ฅผ ํ•˜์—ฌ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ ์ˆ˜

์ž‡๋Š” ๋ฐ ์ด ํŠน์„ฑ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด, ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌ ํฌ์ถํŠธ ์™ธ์— ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— on-access/write ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ธŒ๋ ˆ์ดํฌ๋Š” Guard page ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ‚๋‹จํžˆ ๋งํ•˜๋ฉด Guard page ๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋Š ํ•œ ๋ฉ”๋ชจ๋ฆฌ

๋ถ€๋ถ„์— ์ ‘๊ทผํ•  ๋•Œ ์ด๋Ÿฐ ๊ฒฝ๋กœ๋ฅผ ์–ป์„ ์ˆ˜ ์ž‡๊ฒŒ๋” ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค.

Guard page ๋Š” PAGE_GUARD ์˜ page protection modifier ์„ ํ†ตํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผํ•œ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๊ฐ€ Guard page ์˜ ์ฃผ์†Œ

์ด๋ฉด STATUS_GUARD_PAGE_VIOLATION (0x80000001) ์˜ˆ์™ธ๋ฅผ ์ท์œผํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋กœ ๋””๋ฒ„๊น…ํ•˜์—ฌ Guard page ์—

์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์˜ˆ์™ธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ธŒ๋ ˆ์ดํฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ์ฝ”๋“œ ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์„œ PAGE_GUARD ์˜ ์†์„ฑ์„ enable ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— page guard ๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋˜๋ฉด eax ๊ฐ€ 0 ์ด ๋˜๊ณ  STATUS_GUARD_PAGE_VIOLATION ์„ ์ท์œผํ‚ต๋‹ˆ๋‹ค.

์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋กœ ์ด ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋ฉด ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์˜ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

; set up exception handler

push .execption_handler

push dword [fs:0]

mov [fs:0], esp

; allocate memory

push PAGE_READWRITE

push MEM_COMMIT

Page 21: [The Art of Unpacking]

21 | ํŽ˜ ์ด ์ง€

push 0x1000

push NULL

call [VirtualAlloc]

test eax,eax

jz .failed

mov [.pAllocatedMem],eax

; store a RETN on the allocated memory

mov byte [eax],0xc3

; then set the PAGE_GUARD attribute of the allocated memory

lea eax,[.dwOldProtect]

push eax

push PAGE_EXECUTE_READ | PAGE_GUARD

push 0x1000

push dword [.pAllocatedMem]

call [VirtualProtect]

; set marker (eax) as 0

xor eax,eax

; trigger a STATUS_GUARD_PAGE_VIOLATION exeception

call [.pAllocatedMem]

; check if marker had not been changed (exception handler not called)

test eax,eax

je .debugger_found

:::

.exception_handler

Page 22: [The Art of Unpacking]

22 | ํŽ˜ ์ด ์ง€

;EAX = CONTEXT record

mov eax, [esp+0xc]

;set marker (CONTEXT.EAX) to 0xffffffff

; to signal that the exception handler was called

mov dword [eax+0xb0],0xffffffff

xor eax,eax

retn

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๊ฐ€๋“œ ํŽ˜์ด์ง€๋“ค์ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ๋ฆฌ๋ฒ„์„œ๋“ค์€ ์˜๋„์ ์œผ๋กœ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์ค‘ ์—์„œ ๋ฆฌ๋ฒ„์„œ๋Š”

RETN ๋ช…๋ น์„ INT 3 ๋ช…๋ น์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. INT3 ์œผ๋กœ ๋ฐ”๊พผ๋’ค Shift +F9 ๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐ•์ œ๋กœ ๋””๋ฒ„๊ฑฐ์—๊ฒŒ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ

๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ถˆ๋Ÿฌ์™€์งˆ ๋•Œ EAX ๋Š” ์ •ํ™•ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  RETN ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ

๋ฉ๋‹ˆ๋‹ค.

๋งŠ์•ฝ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ STATUS_GUARD_PAGE_VIOLATION ์— ์ด์ƒ์ด ์ž‡๋Š”์ง€ ์ฒดํฌ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์—

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์€๋’ค์— ExceptionRecord ์˜ ์ ‚๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ • ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋ฉด

ExceptionRecord ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ Exception Code ๋ฅผ STATUS_GUARD_PAGE_VIOLATION ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3. THCHMIQUES : BREAKPOINT AND PATCHING DETECTION

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ํŒจ์ปค๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ,ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ์™€ ํŒจ์นญ ๋””ํ…์…˜ ๋Œ€ํ•ด

์–˜๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3.1 Sofrware Breakpoint Detection

์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋Š” ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์„ ๊ณณ์— 0xCC (INT3/Breakpoint Interrupt)๋กœ ์„ค์ • ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

ํŒจ์ปค๋Š” ๋ณดํ˜ธ๋œ ์ฝ”๋“œ์™€ API ํ•จ์ˆ˜ ์•†์—์„œ 0xCC ๋กœ ๋œ ๋ฐ”์ดํŠธ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ‚๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

Page 23: [The Art of Unpacking]

23 | ํŽ˜ ์ด ์ง€

Cld

mov edi,Protected_Code_Start

mov ecx,Protected_Code_End - Protected_Code_Start

mov al,0xcc

repne scasb

jz .breakporin_found

์–ด๋–ค ํŒจ์ปค๋Š” ๋น„๊ต๋˜๋Š” ๋ฐ”์ดํŠธ๋ฅผ ์•ฝ๊ฐ‚์˜ ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ์ •ํ™•ํ•˜๊ฒŒ ์ฒดํฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

if(byte XOR 0x55 == 0x99) then breakpoint found

where: 0x99 == 0xCC XOR 0x55

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ํ™•์ถ ํ•  ์ˆ˜ ์ž‡๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋“ค์€ ๊ทธ๋Œ€์‹ž ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. API

์ฝ”๋“œ ์•†์—์„œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ํ•„์š” ํ•  ๋•Œ ํŒจ์ปค๊ฐ€ API ์ฝ”๋“œ ์•†์—์„œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ ์‹œ๋„ํ•œ๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋“ค์€

UNICODE ๋ฒ„์ ‚์˜ API ํ•จ์ˆ˜๋ฅผ ANSI ๋ฒ„์ ‚(์˜ˆ: LoadLibraryExW ๋Œ€์‹ž LoadLibraryA)์˜ ํ•จ์ˆ˜ ๋˜๋Š” ์ท์น˜ํ•˜๋Š” Native API

(ntdll!LdrLoadDll) ํ•จ์ˆ˜๋กœ ๋Œ€์‹ž ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜๋„ ์ž‡์Šต๋‹ˆ๋‹ค.

3.2 Hardware Breakpoint Detection

๋˜ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋Š” ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋Š” ๋””๋ฒ„๊ฑฐ ๋ ˆ์ง€์Šคํ„ฐ๋“ค๋กœ

์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ด ๋ ˆ์ง€์Šคํ„ฐ๋“ค์˜ ์ด๋ฆ„์€ Dr0 ๋ถ€ํ„ฐ Dr7 ๊นŒ์ง€ ์ž‡์Šต๋‹ˆ๋‹ค. Dr0 - Dr3 ์—๋Š” 4 ๊ฐœ์˜ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ ์ฃผ์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ 

์ž‡์Šต๋‹ˆ๋‹ค. Dr6 ์€ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ์–ด๋””์„œ ์œ ๋ฐœ ๋˜์—ˆ๋Š”์ง€๋ฅผ ๋‹ด๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค.. Dr7 ์€ 4 ๊ฐœ์˜ ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ

์ธ๊ธฐ/์“ฐ๊ธฐ/์ค‘์ง€๋ฅผ enabling/disabling ํ•˜๋Š” ๊ฒƒ์„ ๋‹ด๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค.

Ring3 ๋ชจ๋“œ ์—์„œ๋Š” ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์„œ ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌ ํฌ์ถํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ์ฝ”๋“œ๋ฅผ

์ค€๋น„ํ•ด์•ผ ๋ฉ๋‹ˆ๋‹ค.. ๊ทธ๋ž˜์„œ ํŒจ์ปค๋Š” CONTEXT ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‡๋Š” ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. CONTEXT ๊ตฌ์กฐ์ฒด๋Š”

์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฐœ์ƒํ•œ ContextRecord ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ‘๊ทผ ํ• ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

Page 24: [The Art of Unpacking]

24 | ํŽ˜ ์ด ์ง€

์˜ˆ์ œ

์—ฌ๊ธฐ์˜ ์˜ˆ์ œ๋Š” ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๋“ค๊ณผ ์งˆ์˜๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

; set up exception handler

push .exception_handler

push dword [fs:0]

mov [fs:0], esp

; eax will be 0xffffffff if hardware breakpoints are identified

xor eax,eax

; throw an exception

mov dword[eax],0

; restore exception handler

pop dword [fs:0]

add exp,4

; test if EAX was updated (breakpoint identified)

test eax,eax

jnz .breakpoint_found

:::

.exception_handler

;EAX = CONTEXT record

mov eax,[esp+0xc]

Page 25: [The Art of Unpacking]

25 | ํŽ˜ ์ด ์ง€

;check if debug Registers Context. Dr0-Dr3 is not zero

cmp dword [eax+0x04],0

jne .hardware_bp_found

cmp dword [eax+0x08],0

jne .hardware_bp_found

cmp dword [eax+0x0c],0

jne .hardware_bp_found

cmp dword [eax+0x10],0

jne .hardware_bp_found

jmp .exception_ret

.hardware_bp_found

; set Context.EAX to signal breakpoint found

mov dword [eax+0xb0],0xffffffff

.exception_ret

; set Context.EIP upon return

add dword [eax+0xb8],6

xor eax,eax

retn

์–ด๋–ค ํŒจ์ปค๋Š” ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์˜ ์ท๋ถ€๋ฅผ ๋ณตํ˜ธํ™” ํ‚ค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ ํŠน์ • ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๊ฑฐ๋‚˜ 0 ์œผ๋กœ ๊ฐ’

์„ ์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์ˆ˜์ •๋˜๋ฉด ๋ณตํ˜ธํ™”๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณตํ˜ธํ™” ์ฝ”๋“œ๊ฐ€ ํŒจํ‚น๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ธํŒจํ‚นํ•˜๋Š”

์ฝ”๋“œ์˜ ์ท๋ถ€๋ถ„ ์ท๋•Œ ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋˜๊ฒŒ ๋˜๋ฉด ๋ณตํ˜ธํ™”๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ช…๋ น์ด ๋ฐœ์ƒ๋˜์–ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ข…๋ฃŒ๊ฐ€

์ท์–ด๋‚ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

Page 26: [The Art of Unpacking]

26 | ํŽ˜ ์ด ์ง€

ํŒจ์ปค๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋“ค์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ/์“ฐ๊ธฐ ํ•  ๋•Œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๋“ค์ด API ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ์˜

์„ค์ •์ด ํ•„์š”ํ•  ๋•Œ Native API ๋˜๋Š” UNICODE ๋ฒ„์ ‚์˜ API ๋‚ด๋ถ€์— ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์„ค์ •ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

3.3 Patching Detection via Code Checksum Calculation

ํŒจ์นญ ๋””ํ…์…˜(Patching Detection)์€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • ํ•˜์˜€๋Š”์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ํŒจ์ปค์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์•†ํ‹ฐ

๋””๋ฒ„๊น…๋ฃจํ‹ด์ด ๋น„ํ™—์„ฑํ™” ๋œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์„ค์ •ํ•˜์˜€๋Š”์ง€๋„ ์‹๋ณ„ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ํŒจ์นญ

๋””ํ…์…˜์€ ์ฝ”๋“œ๋ฅผ ์ฒดํฌ์„ฌ ํ•ฉ๋‹ˆ๋‹ค. ์ฒดํฌ์„ฌ ๊ณ„์‚ฐ์€ ๊ฐ‚๋‹จํ•œ ๊ณ„์‚ฐ ๊ณผ ๋ณต์žกํ•œ ์ฒดํฌ์„ฌ/ํ•ด์‰ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜๋Š” ๋น„๊ต์  ๊ฐ‚๋‹จํ•œ ์ฒดํฌ์„ฌ ๊ณ„์‚ฐ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

mov esi,Protected_Code_Start

mov ecx,Protected_Code_End - Protected_Code_Start

xor eax,eax

.checksum_loop

movzx ebx,byte [esi]

add eax,ebx

rol eax,1

inc esi

loop .checksum_loop

cmp eax,dword [.dwCorrectChecksum]

jne .patch_found

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ฝ”๋“œ ์ฒดํฌ์„ฌ ๋ฃจํ‹ด์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์‹๋ณ„ํ•ด๋ƒˆ๋‹ค๋ฉด ํ•˜๋“œ์›จ์–ด๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

Page 27: [The Art of Unpacking]

27 | ํŽ˜ ์ด ์ง€

์ฒดํฌ์„ฌ์—์„œ ์ฝ”๋“œ๊ฐ€ ํŒจ์น˜ ๋˜๋Š” ๊ฒƒ์„ ์‹๋ณ„ํ•ด ๋ƒˆ๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” ํŒจ์น˜ ๋œ ์ฃผ์†Œ๋ฅผ ํ†ตํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์„ค์ •ํ•˜์—ฌ

์ฒดํฌ์„ฌ ์ฝ”๋“œ๋ฃจํ‹ด์ด ์ž‡๋Š” ๊ณณ์„ ์ฐพ์„ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ฒดํฌ์„ฌ ๋ฃจํ‹ด์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์ฒดํฌ์„ฌ๊ฐ’ ๊ณผ ์ถ”์ธก ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜

๋น„๊ต๊ฐ€ ์‹คํŒจํ•œ ํ›„ ์ ์ ƒํ•œ ํ”Œ๋ž˜๊ทธ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

4. TECHNIQUES:ANTI-ANALYSIS

anti-analysis ๊ธฐ์ˆ ์€ ๋ฆฌ๋ฒ„์„œ๋“ค์ด ํŒจํ‚น๋œ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋ณดํ˜ธ๋œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์†๋„๋ฅผ ๋Šฆ์ถฐ์ค๋‹ˆ๋‹ค.

์•”ํ˜ธํ™”/์••์ถ•, ์“ฐ๋ ˆ๊ธฐ์ฝ”๋“œ, ์ฝ”๋“œ๋ณ€ํ˜•, ์•†ํ‹ฐ ๋””์–ด์…ˆ๋ธ”๋ฆฌ ๊ธฐ์ˆ ๋“ค์„ ์–˜๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ธฐ์ˆ ์˜ ๋ชฉํ‘œ๋Š” ์ฝ”๋“œ๋ฅผ ๋’ค์„ž์–ด ์ถ๋‚ด์‹ฌ์„

์‹œํ—˜ํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ„์„œ์˜ ์‹œ๊ฐ‚์„ ๋‚ญ๋น„ํ•˜๊ธฐ ์œ„ํ•จ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” ์ถ๋‚ด์‹ฌ์ด ์ž‡์–ด์•ผ ํ•˜๊ณ  ๋˜‘๋˜‘ํ•ด์•ผ

ํ•ฉ๋‹ˆ๋‹ค.

4.1 Encryption and Compression

์•”ํ˜ธํ™” ํ•˜๊ฑฐ๋‚˜ ์••์ถ•์„ ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ถ ์œ ํ˜•์˜ anti-analysis ์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๊ฐ€ ๋ณดํ˜ธ๋œ ์‹คํ–‰ํ”„๋กœ๊ทธ๋žจ์„ ๋ถˆ๋Ÿฌ์™€

๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋กœ ํŽธ์•†ํ•˜๊ฒŒ ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ดˆ๊ธฐ์— ๋ฐฉ์–ด ํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”. ํŒจ์ปค๋Š” ๋ณดํ†ต ๋ณดํ˜ธ๋œ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ณดํ˜ธ ์ฝ”๋“œ

๋‘˜๋‹ค ์•”ํ˜ธํ™” ํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŒจ์ปค ์•†์—์„œ ๋ง‹์€ ๋ณ€ํ™”๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ฃผ ๊ฐ‚๋‹จํ•œ XOR ๋ฐ˜๋ณต ๋ถ€ํ„ฐ ๋งค์šฐ ๋ณต์žกํ•œ ๊ณ„์‚ฐ๋„

์ž‡์Šต๋‹ˆ๋‹ค. ๋‹คํ˜•์„ฑ ํŒจ์ปค๋Š” ๋ถ„์„ ํˆด์ด ํŒจ์ปค์˜ ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•˜์—ฌ ํŒจํ‚น์„ ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ๋ฐฉ์‹์˜

์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณตํ˜ธํ™” ๋ฃจํ‹ด์€ ํ•˜๋‚˜์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์•Œ์•„ ๋ณผ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” ์•”ํ˜ธํ™”๋œ DWORD ๊ฐ’์„ ์—ฌ๋Ÿฌ๋ฒˆ XOR ์—ฐ์‚ฐ ํ•˜๋Š” ๊ฐ‚๋‹จํ•œ ๋ณตํ˜ธํ™” ๋ฃจํ‹ด์ž…๋‹ˆ๋‹ค.

0040A07c LODS DWORD PTR DS:[ESI]

0040A07d XOR EAX,EBX

0040A07f SUB EAX,12338CC3

0040A084 ROL EAX,10

0040A087 XOR EAX,799F82D0

0040A08C STOS DWORD PTR ES:[EDI]

0040A08D INC EBX

0040A08E LOOPD SHORT 0040A07c ;decryption loop

Page 28: [The Art of Unpacking]

28 | ํŽ˜ ์ด ์ง€

์ด๊ณณ์€ ๋˜ ๋‹ค๋ฅธ ๋‹คํ˜•์„ฑ ํŒจ์ปค์˜ ๋ณตํ˜ธํ™” ๋ฃจํ‹ด ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

00476056 MOV BH,BYTE PTR DS:[EAX]

00476058 INC ESI

00476059 ADD BH,0BD

0047605C XOR BH,CL

0047605E INC ESI

0047605F DEC EDX

00476060 MOV BYTE PTR DS:[EAX],BH

00476062 CLC

00476063 SHL EDI,CL

::: More garbage code

00476079 INC EDX

0047607A DEC EDX

0047607B DEC EAX

0047607C JMP SHORT 0047607E

0047607E DEC ECX

0047607F JNZ 00476056 ;decryption loop

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜๋Š” ๊ฐ™์€ ๋‹คํ˜•์„ฑ ํŒจ์ปค์˜ ๋˜ ๋‹ค๋ฅธ ๋ณตํ˜ธํ™” ๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค.

0040C045 MOV CH,BYTE PTR DS:[EDI]

0040C047 ADD EDX,EBX

0040C049 XOR CH,AL

0040C04B XOR Ch,0D9

0040C04E CLC

0040C04F MOV BYTE PTR DS:[EDI],CH

0040C051 XCHG AH,AH

0040C053 BTR EDX,EDX

0040C056 MOVSX EBX,CL

Page 29: [The Art of Unpacking]

29 | ํŽ˜ ์ด ์ง€

::: More garbage code

0040C067 SAR EDX,CL

0040C06C NOP

0040C06D DEC EDI

0040C06E DEC EAX

0040C06F JMP SHORT 0040C071

0040C071 JNZ 0040C045 ;decryption loop

์œ„์˜ ๋‘ ์˜ˆ์ œ์—์„œ ๊ตต์€ ๊ธ€์”จ๋Š” ๋ณตํ˜ธํ™” ๋ช…๋ น์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์˜ ๋ถ€๋ถ„์€ ๋ฆฌ๋ฒ„์„œ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŠ๋“œ๋Š” ์“ฐ๋ ˆ๊ธฐ

์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ณ€ํ•˜๊ณ  ๋ฐ”๋€Œ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๋‘ ์˜ˆ์ œ์—์„œ ๋ณตํ˜ธํ™” ๋ฐฉ๋ฒ•์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€๋„ ์ž˜ ์‚ดํŽด ๋ด์•ผ

ํ•ฉ๋‹ˆ๋‹ค.

์••์ถ•. ์••์ถ•์˜ ์ฃผ๋ชฉ์ ์€ ์‹คํ–‰์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฐ๊ณผ๋กœ ์›๋ณธ ์‹คํ–‰ํŒŒ์ท์˜ ์ธ์„ ์ˆ˜ ์ž‡๋Š”

๋ฌธ์ž์—ด๋“ค๋„ ์••์ถ•๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ๋ฆฌ๋ฒ„์„œ๋“ค์„ ๋‚œ์ฒ˜ํ•˜๊ฒŒ ๋งŠ๋“ญ๋‹ˆ๋‹ค. ํŒจ์ปค ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์••์ถ• ์—”์ง‚์˜ ๋ช‡๊ฐ€์ง€

์˜ˆ๋ฅผ ๋ณด๋ฉด UPX ๋Š” NRV(Not Really Vanished) ์™€ LZMA(Lempei-Ziv-Markov chain-Algorithm)์„ ์‚ฌ์šฉํ•˜๊ณ  FSG ๋Š” aPlib, Upack

๋„ LZMA, yoda's protector ๋Š” LZO ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ์••์ถ• ์—”์ง‚์€ ๋ฌด๋ฃŒ์ด๊ณ  ๋น„์ƒ์—…์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡์ง€๋งŠ ์ƒ์—…์ ์œผ๋กœ

์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ—ˆ๊ฐ€/๋“ฑ๋ก ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋ณตํ˜ธํ™”์™€ ์••์ถ•์„ ํ‘ธ๋Š” ๊ฒƒ์€ ์•„์ฃผ ์‰ฝ๊ฒŒ ์šฐํšŒ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๋Š” ๋‹จ์ง€ ๋ณตํ˜ธํ™”์™€ ์••์ถ•์„ ํ‘ธ๋Š” ๊ฒƒ์ด ์–ธ์ œ ๋๋‚˜๋Š” ์ง€๋งŠ

์ฐพ์–ด๋‚ธ๋‹ค๋ฉด ๋๋‚  ๋•Œ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํŒจ์ปค๋Š” ๋ณตํ˜ธํ™”๊ฐ€ ๋๋‚œ ๋’ค์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ

๋„ฃ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

4.2 Garbage Code And Code Permutation

์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ. ์–ธํŒจํ‚น ๋ฃจํ‹ด์— ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์€ ๋ฆฌ๋ฒ„์„œ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•˜๋Š” ํšจ๊ณผ์ ์ถ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ณตํ˜ธํ™” ๋ฃจํ‹ด ์ด๋‚˜

์•†ํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๋ฃจํ‹ด, ๋””๋ฒ„๊ฑฐ ์ฒดํฌ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ์ง‚์งœ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์ด ๋ฌธ์„œ์—์„œ

๋‚˜์˜ค๋Š” ๋””๋ฒ„๊ฑฐ/๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ/ํŒจ์นญ ๊ฒ€์‚ฌ ๊ธฐ์ˆ ๋“ค์„ ์ˆจ๊ฒจ์„œ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ๋ช…๋ น์œผ๋กœ ๋ณด์ด๊ฒŒ

ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํšจ๊ณผ์ ์ถ ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ท์„ ํ•˜๋Š” ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Page 30: [The Art of Unpacking]

30 | ํŽ˜ ์ด ์ง€

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” ๋ณตํ˜ธํ™” ๋ฃจํ‹ด์— ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋„ฃ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

0044A21A JMP SHORT sample.0044A21F

0044A21C XOR DWORD PTR SS:[EBP],6E4858D

0044A223 INT 23

0044A225 MOV ESI,DWORD PTR SS:[ESP]

0044A228 MOV EBX,2C322FF0

0044A22D LEA EAX,DWORD PTR SS:[EBP+6EE5B321]

0044A233 LEA ECX DWORD PTR DS:[ESI+543D583E]

0044A239 ADD EBP,742C0F15

0044A23F ADD DWORD PTR DS:[ESI],3CB3AA25

0044A245 XOR EDI,7DAC77E3

0044A24B CMP EAX,ECX

0044A24D MOV EAX,5ACAC514

0044A252 JMP SHORT sample.0044A257

0044A254 XOR DWORD PTR SS:[EBP],AAE4725

0044A25B PUSH ES

0044A25C ADD EBP,5BAC5C22

0044A262 ADD ECX,3D71198C

0044A268 SUB ESI,-4

0044A26B ADC ECX,3795A210

0044A271 DEC EDI

0044A272 MOV EAX,2F57113F

0044A277 PUSH ECX

0044A278 POP ECX

0044A279 LEA EAX,DWORD PTR SS:[EBP+3402713D]

0044A27F DEC EDI

Page 31: [The Art of Unpacking]

31 | ํŽ˜ ์ด ์ง€

0044A280 XOR DWORD PTR DS:[ESI],33B568E3

0044A286 LEA EBX,DWORD PTR DS:[EDI+57DEFEE2]

0044A28C DEC EDI

0044A28D SUB EBX,7ECDAE21

0044A293 MOV EDI,185C5C6C

0044A298 MOV EAX,4713E635

0044A29D MOV EAX,4

0044A2A2 ADD ESI,EAX

0044A2A4 MOV ECX,1010272F

0044A2A9 MOV ECX,7A49B614

0044A2AE CMP EAX,ECX

0044A2B0 NOT DWORD PTR DS:[ESI]

์˜ˆ์ œ์—์„œ ๋ณตํ˜ธํ™”์— ๊ด€๋ ฆ๋œ ๋ช…๋ น์–ด :

0044A225 MOV ESI,DWORD PTR SS:[ESP]

0044A23F ADD DWORD PTR DS:[ESI],3CB3AA25

0044A268 SUB ESI,-4

0044A280 XOR DWORD PTR DS:[ESI],33B568E3

0044A29D MOV EAX,4

0044A2A2 ADD ESI,EAX

0044A2B0 NOT DWORD PTR DS:[ESI]

์ฝ”๋“œ ๋ณ€ํ˜•. ์ฝ”๋“œ ๋ณ€ํ˜•์€ ์ข€๋” ์ง‚๋ณด๋œ ํŒจ์ปค๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ณ€ํ˜•์„ ํ†ตํ•˜์—ฌ ๊ฐ‚๋‹จํ•œ ๋ช…๋ น์–ด๋ฅผ ์ข€๋” ๋ณต์žกํ•œ

๋ช…๋ น์–ด๋“ค๋กœ ๋ณ€ํ™–์‹œํ‚ต๋‹ˆ๋‹ค. ํŒจ์ปค๊ฐ€ ๋ช…๋ น์–ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ด์™€ ๋น„์Šทํ•œ ์ƒˆ๋กœ์šฒ ๋ช…๋ น์–ด๋“ค๋กœ ์ƒ์„ฑ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ‚๋‹จํ•œ ์ฝ”๋“œ ๋ณ€ํ˜•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค:

mov eax,ebx

test eax,eax

Page 32: [The Art of Unpacking]

32 | ํŽ˜ ์ด ์ง€

์•„๋ž˜์˜ ๋ช…๋ น์–ด๋“ค๋กœ ๋ณ€ํ™–ํ•ฉ๋‹ˆ๋‹ค:

push ebx

pop eax

or eax,eax

์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ณ€ํ˜•์€ ๋ฆฌ๋ฒ„์„œ๊ฐ€ ๋ณดํ˜ธ๋œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ์†๋„๋ฅผ ๋Šฆ์ถฐ์ฃผ๋Š” ํšจ๊ณผ์ ์ถ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ

์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ์ฝ”๋“œ๋Š” ๋””๋ฒ„๊ฑฐ ํƒ์ง€ ๋ฃจํ‹ด์— ์ฝ”๋“œ๋ณ€ํ˜•๊ณผ ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

004018A3 MOV EBX,A104B3FA

004018A8 MOV ECX,A104B412

004018AD PUSH 004018C1

004018B2 RETN

004018B3 SHR EDX,5

004018B6 ADD ESI,EDX

004018B8 JMP SHORT 004018BA

004018BA XOR EDX,EDX

004018BC MOV EAX,DWORD PTR DS:[ESI]

004018BE STC

004018BF JB SHORT 004018DE

004018C1 SUB ECX,EBX

004018C3 MOV EDX,9A01AB1F

004018C8 MOV ESI,DWORD PTR FS:[ECX]

004018CB LEA ECX,DWORD PTR DS:[EDX+FFFF7FF7]

004018D1 MOV EDX,600

004018D6 TEST ECX,2B73

004018DC JMP SHORT 004018B3

004018DE MOV ESI,EAX

004018E0 MOV EAX,A35ABDE4

Page 33: [The Art of Unpacking]

33 | ํŽ˜ ์ด ์ง€

004018E5 MOV ECX,FAD1203A

004018EA MOV EBX,51AD5EF2

004018EF DIV EBX

004018F1 ADD BX,445A

004018F6 ADD ESI,EAX

004018F8 MOVZX E ์•ผ,BYTE PTR DS:[ESI]

004018FB OR EDI,EDI

004018FD JNZ SHORT 00401906

์ด ์˜ˆ์ œ๋Š” ๊ฐ‚๋‹จํ•œ ๋””๋ฒ„๊ฑฐ ํƒ์ง€ ๋ฃจํ‹ด์ถ ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

00401081 MOV EAX,DWORD PTR FS:[18]

00401087 MOV EAX,DWORD PTR DS:[EAX+30]

0040108A MOVZX EAX,BYTE PTR DS:[EAX+2]

0040108E TEST EAX,EAX

00401090 JNZ SHORT 00401099

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๋“ค๊ณผ ์ฝ”๋“œ ๋ณ€ํ˜•์€ ์ถ๋‚ด์‹ฌ์„ ์‹œํ—˜ํ•˜๊ณ  ๋ฆฌ๋ฒ„์„œ์˜ ์‹œ๊ฐ‚์„ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋Ÿฐ ๊ธฐ์ˆ  ์ด ์ˆจ๊ธด ์ค‘์š”ํ•œ ๋ช…๋ น์–ด๋ฅผ

์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ:๋‹จ์ง€ ๋ณตํ˜ธํ™”๋งŠ ํ•˜๋Š”์ง€ ํŒจ์ปค๊ฐ€ ์ดˆ๊ธฐํ™”์ถ์ง€ ๋“ฑ๋“ฑ).

์ด๋Ÿฌํ•œ ์ˆจ์–ด์ž‡๋Š” ๋ช…๋ น์–ด๋ฅผ ํŠธ๋ ˆ์ด์‹ฑ ํ•  ์ˆ˜ ์ž‡๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ํŒจ์ปค๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” API ํ•จ์ˆ˜(์˜ˆ: VirtualAlloc,

VirtualProtect, LoadLibrary, GetProcAddress, ๋“ฑ๋“ฑ)๋“ค์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด ์ด๋Ÿฐ API ๋“ค์„ ์ถ”์  ๋ชฉํ‘œ๋กœ ์žก๊ณ  ํŠธ๋ ˆ์ด์‹ฑ

ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŠ์•ฝ ๊ทธ๊ณณ์—์„œ ์—๋Ÿฌ(๋””๋ฒ„๊ฑฐ ๋‚˜ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ ํƒ์ง€)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๊ทธ ์ฝ”๋“œ๋ฅผ ์ถ”์  ๋ชฉํ‘œ๋กœ ์žก๊ณ  ์ž์„ธํ•˜๊ฒŒ

์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฆฌ๋ฒ„์„œ๋Š” ์ ‘๊ทผ/์“ฐ๊ธฐ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋“ค์„ ์„ค์ •ํ•˜์—ฌ ๋ณดํ˜ธ๋œ ์ฝ”๋“œ์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ˆ˜์ •/์ ‘๊ทผ

ํ•ด์•ผ์ง€ ๋Œ€๋Ÿ‰์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ ํ•˜๋Š” ๊ฑด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, VMWare ์—์„œ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋””๋ฒ„๊น… ์„ธ์…˜์„ ์ €์žฅํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌ๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” ์–ด๋Š ํ•œ

ํŠน์ • ์ถ”์  ๋ถ€๋ถ„์˜ ์ƒํƒœ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋‚˜๋„ ํŠน์ •์„ธ์…˜๋ถ€๋ถ„์œผ๋กœ ๋Œ์•„์™€ ๊ณ„์† ๋ถ„์„ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

Page 34: [The Art of Unpacking]

34 | ํŽ˜ ์ด ์ง€

4.3 Anti-Disassembly

๋ฆฌ๋ฒ„์„œ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ์ถœ๋ ฅํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์ •์ ์ถ ๋ถ„์„์„ ๊ฑฐ์นœ ๋ฐ”์ด๋„ˆ๋ฆฌ์ฝ”๋“œ์˜ ๊ณผ์ •์„ ์ดํ•ดํ•˜์—ฌ ๋ณต์žกํ•˜๊ฒŒ ๋งŠ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์“ฐ๋ ˆ๊ธฐ

์ฝ”๋“œ์™€ ์ฝ”๋“œ ๋ณ€ํ˜•์„ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋”์šฑ ํšจ๊ณผ์ ์ท ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ๊ธฐ์ˆ ์˜ ํ•œ๊ฐ€์ง€ ์˜ˆ๋กœ๋Š” ์“ฐ๋ ˆ๊ธฐ ๋ฐ”์ดํŠธ๋ฅผ ๋„ฃ์–ด๋‘๊ณ  ๋ถ„๊ธฐ๋ฌธ์—์„œ ๋„˜์–ด์™€ ์“ฐ๋ ˆ๊ธฐ ๋ฐ”์ดํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŠ ๋ถ„๊ธฐ๋ฌธ์€ ํ•ญ์ƒ FALSE ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜์›ํžˆ ์“ฐ๋ ˆ๊ธฐ ๋ฐ”์ดํŠธ๋“ค์€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ์“ฐ๋ ˆ๊ธฐ

๋ฐ”์ดํŠธ ์ฃผ์†Œ๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”๋ง์„ ํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ์ž˜๋ชป๋œ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ถœ๋ ฅ์„ ํ•˜๊ฒŒ ๋˜๋Š” ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ

์ด ์˜ˆ์ œ๋Š” ๊ฐ‚๋‹จํ•œ PEB.BeingDebugged ํ”Œ๋ž˜๊ทธ ์ฒดํฌ ์— ์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ตต์€ ๊ธ€์”จ๋กœ ๋œ ๋ถ€๋ถ„์€

์ฃผ์š” ๋ช…๋ น์–ด์ด๊ณ  ๊ทธ ์™ธ๋Š” ์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์“ฐ๋ ˆ๊ธฐ ๋ฐ”์ดํŠธ์ถ 0xFF ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถ„๊ธฐ๋ฌธ์—์„œ ๊ฑฐ์ง“ ์กฐ๊ฑด์œผ๋กœ

์ ํ”„ํ•œ ๋’ค ์“ฐ๋ ˆ๊ธฐ ๋ฐ”์ดํŠธ๋“ค์„ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ํŠธ๋ ˆ์ด์‹ฑ ํ•ฉ๋‹ˆ๋‹ค:

;Anti-disassembly sequence #1

push .jmp_real_01

stc

jnc .jmp_fake_01

retn

.jmp_fake_01:

db 0xff

.jmp_real_01:

mov eax,dword [fs:0x18]

;Anti-disassembly sequence #2

push .jmp_real_02

clc

jc .jmp_fake_02

retn

Page 35: [The Art of Unpacking]

35 | ํŽ˜ ์ด ์ง€

.jmp_fake_02:

db 0xff

.jmp_real_02

;-------------------

mov eax,dword [eax+0x30]

movzx eax,byte [eax+0x02]

test eax,eax

jnz .debugger_found

์•„๋ž˜๋Š” WinDbg ์˜ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค:

0040194a 6854194000 push 0x401954

0040194f f9 stc

00401950 7301 jnb image00400000+0x1953 (00401953)

00401952 c3 ret

00401953 ff64a118 jmp dword ptr [ecx+0x18]

00401957 0000 add [eax],al

00401959 006864 add [eax+0x64],ch

0040195c 194000 sbb [eax],eax

0040195f f8 clc

00401960 7201 jb image00400000+0x1963 (00401963)

00401962 c3 ret

00401963 ff8b40300fb6 dec dword ptr [ebx+0xb60f3040]

00401969 40 inc eax

0040196a 0285c0750731 add al,[ebp+0x310775c0]

๊ทธ๋ฆฌ๊ณ  ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ์˜ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค:

0040194A 68 54194000 PUSH 00401954

0040194F F9 STC

Page 36: [The Art of Unpacking]

36 | ํŽ˜ ์ด ์ง€

00401950 73 01 JNB SHORT 00401953

00401952 C3 RETN

00401953 FF64A1 18 JMP DWORD PTR DS:[ECX+18]

00401957 0000 ADD BYTE PTR DS:[EAX],AL

00401959 0068 64 ADD BYTE PTR DS:[EAX+64],CH

0040195C 1940 00 SBB DWORD PTR DS:[EAX],EAX

0040195F F8 CLC

00401960 72 01 JB SHORT 00401963

00401962 C3 RETN

00401963 FF8B 40300FB6 DEC DWORD PTR DS:[EBX+B60F3040]

00401969 40 INC EAX

0040196A 0285 C0750731 ADD AL,BYTE PTR SS:[EBP+310775C0]

๋งˆ์ง€๋ง‰์œผ๋กœ IDAPro ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค:

0040194A push (offset loc_401953+1)

0040194F stc

00401950 jnb short loc_401953

00401952 retn

00401953 ; ------------------------------------------------------

00401953

00401953 loc_401953: ; CODE XREF: sub_401946+A

00401953 ; DATA XREF: sub_401946+4

00401953 jmp dword ptr [ecx+18h]

00401953 sub_401946 endp

00401953

00401953 ; ------------------------------------------------------

00401957 db 0

00401958 db 0

Page 37: [The Art of Unpacking]

37 | ํŽ˜ ์ด ์ง€

00401959 db 0

0040195A db 68h ; h

0040195B db offset unk_401964

0040195F db 0F8h ; ยฐ

00401960 db 72h ; r

00401961 db 1

00401962 db 0C3h ; +

00401963 db 0FFh

00401964 unk_401964 db 8Bh ; รฏ

00401965 db 40h ; @

00401966 db 30h ; 0

00401967 db 0Fh

00401968 db 0B6h ; |

00401969 db 40h ; @

0040196A db 2

0040196B db 85h ; ร 

0040196C db 0C0h ; +

0040196D db 75h ; u

์ด ์„ธ๊ฐ€์ง€ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ/๋””๋ฒ„๊ฑฐ ๊ฐ€ ์–ด๋–ป๊ฒŒ ์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ํŠธ๋ฆญ์— ๋น ์ ธ๋“ค์—ˆ๋Š”์ง€ ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ฆฌ๋ฒ„์„œ๊ฐ€

์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š”๋ฐ ๋งค์šฐ ๊ท€์ฐฎ๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋ฆฌ๋ฒ„์„œ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ง€ ๊ทธ

์ค‘ ํ•˜๋‚˜ ์ท ๋ฟ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋Š” ๋งคํฌ๋กœ๋กœ ์ฝ”๋”ฉ ํ•  ์ˆ˜ ์ž‡์–ด์„œ ์–ด์…ˆ๋ธ”๋ฆฌ ์†Œ์Šค๋Š” ๋งค์šฐ ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค.

๋…์ž๋“ค์€ Eldad Eliam ์˜ ํ›Œ๋ฅญํ•œ ๋ฆฌ๋ฒ„์‹ฑ ์ฑ…์„ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ์ฑ…์—๋Š” ์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ๊ธฐ์ˆ ๊ณผ ๋‹ค๋ฅธ ๋ฆฌ๋ฒ„์‹ฑ์ฃผ์ œ์—

๋Œ€ํ•ด ์ž์„ธํ•˜๊ฒŒ ๋‚˜์™€์ž‡์Šต๋‹ˆ๋‹ค.

5. THCHNIQUES : DEBUGGER ATTACKS

Page 38: [The Art of Unpacking]

38 | ํŽ˜ ์ด ์ง€

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ํŒจ์ปค๊ฐ€ ๋””๋ฒ„๊ฑฐ๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ์ˆ ์„ ์—ด๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น…์ค‘ ์ด๋ผ๋ฉด ๊ฐ‘์ž๊ธฐ ์ •์ง€ ๋˜๊ณ 

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋„ ํ•ด์ œ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์— anti-analysis ๊ธฐ์ˆ ์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ์ˆจ๊ธฐ๋ฉด ๋” ํšจ๊ณผ์ ์ท ๊ฒƒ์ž…๋‹ˆ๋‹ค.

5.1 Misdirection and Stopping Execution via Exceptions

๋‹จ์ˆšํ•œ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋Š” ๋ฆฌ๋ฒ„์„œ ๋“ค์ด ์‰ฝ๊ฒŒ ์ฝ”๋“œ์˜ ๋ชฉํ‘œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žฅ์•…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ํŒจ์ปค๋“ค์€ ๋ช‡๋ช‡ ๊ธฐ์ˆ ์„

์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ˆšํ•œ ํ˜•ํƒœ๊ฐ€ ๋˜์ง€ ์•Š๊ฒŒ ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š”๋ฐ ์‹œ๊ฐ‚์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ท๋ฐ˜์ ์œผ๋กœ ์–ธํŒจํ‚น์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์„ ๋•Œ ๋ฆฌ๋ฒ„์„œ๋Š” EIP ๊ฐ€ ์–ด๋””๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ์ดํ•ดํ•˜์—ฌ์•ผ ํ•˜๊ณ  ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ

์‹คํ–‰์ด ๋๋‚œ ํ›„์— EIP ๊ฐ€ ๋˜ ์–ด๋””๋ฅผ ๊ฐ€๋ฅด ํ‚ค๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ, ์˜ˆ์™ธ๋Š” ํŒจ์ปค๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์–ธํŒจํ‚น ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ

๋””๋ฒ„๊น…ํ•  ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋””๋ฒ„๊ฑฐ๋Š” ์–ธํŒจํ‚น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ท์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŒจ์ปค๋Š” ์ท๋ฐ˜์ ์œผ๋กœ Structured Exception Handling(SEH)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์„ ์“ฐ๋Š”๋ฐ ์ƒˆ๋กœ์šฒ ํŒจ์ปค๋“ค์€ ๋ฒกํ„ฐ์‹

์˜ˆ์™ธ(Vectored Exceptions) ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ์ฝ”๋“œ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์˜ˆ์™ธ(INTO ๋ฅผ ํ†ตํ•ด)๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ๋•Œ ๋ช‡ ๊ฐœ์˜ ๋ฃจํ”„๋ฅผ ๋Œ์•„ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ํ”Œ๋ž˜๊ทธ๋Š” ROL ๋ช…๋ น์–ด์—

์˜ํ•ด ์„ค์ •๋œ ํ›„ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์˜ˆ์™ธ๋Š” ํŠธ๋žฉ(trap) ์˜ˆ์™ธ ์ด๋ฏ€๋กœ EIP ๋Š” JMP ๋ช…๋ น์„ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

๋ฆฌ๋ฒ„์„œ๊ฐ€ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์— ์˜ˆ์™ธ(Shift + F7/F8/F9 ๋ฅผ ํ†ตํ•˜์—ฌ)๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ง‚ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š”

์˜์›ํžˆ ๋ฃจํ”„๋ฅผ ๋Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

; set up exception handler

push .exception_handler

push dword [fs:0]

mov [fs:0],esp

; throw an exception

mov ecx,1

Page 39: [The Art of Unpacking]

39 | ํŽ˜ ์ด ์ง€

.loop:

rol ecx,1

into

jmp .loop

; restore exception handler

pop dword [fs:0]

add esp,4

:::

.exception_handler

;EAX = CONTEXT record

mov eax,[esp+0xc]

;set Context.EIP upon return

add dword [eax+0xb8],2

xor eax,eax

retn

ํŒจ์ปค๋Š” ์ท๋ฐ˜์ ์œผ๋กœ access violations(0xC0000005), breakpoint(0x80000003),single step(0x80000004) ์˜ˆ์™ธ๋ฅผ ์ท์œผํ‚ฌ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํŒจ์ปค๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ง€ ๊ฒฐ๊ณผ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ์‹คํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ท ๋•Œ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋Š” ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ

ํ•ด์ค„์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์˜ต์…˜์—์„œ -> Debugging Options -> Exceptions. ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์„ ์„ค์ •ํ•  ์ˆ˜ ์ž‡๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜

์ž‡์Šต๋‹ˆ๋‹ค.

Page 40: [The Art of Unpacking]

40 | ํŽ˜ ์ด ์ง€

๋ฆฌ๋ฒ„์„œ๋Š” ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

ํŒจ์ปค๊ฐ€ ์ค‘์š”ํ•œ ๋ช…๋ น์„ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฆฌ๋ฒ„์„œ๋Š” ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด ์ฃผ์†Œ๊ฐ€ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ์—์„œ

๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ Shitf+F7/F8/F9 ๋ˆŒ๋Ÿฌ์„œ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ ‚ํ•ด์ค€ ๋’ค View -> SEH Chain ์—์„œ ํ™•์ถํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

5.2 Blocking Input

ํŒจ์ปค๋Š” ์–ธํŒจํ‚น ๋ฃจํ‹ด์ด ์‹คํ–‰๋  ๋•Œ user32!BlockInput() API ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ณด๋“œ์™€ ๋งˆ์šฐ์Šค์˜ ์ž…๋ ฅ์„ ๋ง‰์•„์„œ ๋ฆฌ๋ฒ„์„œ๊ฐ€

๋””๋ฒ„๊ฑฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ์™€ ์•†ํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ๊ธฐ์ˆ ์„ ํ†ตํ•˜์—ฌ ์ˆจ์–ด์„œ ๋ฆฌ๋ฒ„์„œ์—๊ฒŒ ๋“คํ‚ค์ง€

์•Š๋Š”๋‹ค๋ฉด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ ์‹œ์Šคํ…œ์ด ๋ฐ˜์‘์ด ์—†์œผ๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” ๋– ๋‚˜๊ฒŒ ๋˜์–ด ์–ธํŒจํ‚น์— ์‹คํŒจํ•˜๊ฒŒ

๋ฉ๋‹ˆ๋‹ค.

์ท๋ฐ˜์ ์ถ ์˜ˆ์ œ๋Š” ๋ฆฌ๋ฒ„์„œ๊ฐ€ GetProcAddress() ์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด ์–ธํŒจํ‚น์„ ํ•  ๋•Œ ๋ช‡ ๊ฐœ์˜ ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๋“ค์„ ์ง€๋‚˜๊ฐ€๊ณ 

ํŒจ์ปค๋Š” BlockInput() ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  GetProcAddress() ์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ๊ฑธ๋ฆฏ ๋•Œ ๋ฆฌ๋ฒ„์„œ๋Š” ๊ฐ‘์ž๊ธฐ ๋””๋ฒ„๊น… ํˆด์„

์กฐ์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์–ด ๋‚œ์ฒ˜ํ•ด ํ•˜๋‹ค๊ฐ€ ์ข…๋ฃŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ

BlockInput() ์€ boolean ํ˜•์˜ fBlockIt ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. TRUE ์ด๋ฉด ํ‚ค๋ณด๋“œ์™€ ๋งˆ์šฐ์Šค๋Š” ์ •์ง€๋˜๊ณ  FALSE ์ด๋ฉด ์ •์ง€๊ฐ€

ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

; Block input

Page 41: [The Art of Unpacking]

41 | ํŽ˜ ์ด ์ง€

push TRUE

call [BlockInput]

; ...Unpacking code...

; Unblock input

push FALSE

call [BlockInput]

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋‹คํ–‰ํžˆ๋„ ๊ฐ‚๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ BlockInput()๋ฅผ ํŒจ์น˜ ํ•˜์—ฌ ๋ฆฌํ„ด ์‹œํ‚ฌ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด ์˜ฌ๋ฆฌ์Šคํฌ๋ฆฑํŠธ๋Š” user32!BlockInput()์˜ ์•†์—์„œ

ํŒจ์น˜๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

gpa "BlockInput", "user32.dll"

mov [$RESULT]. #c20400# //retn 4

Olly Advanced ํ”Œ๋Ÿฌ๊ทธ์ถ ์—์„œ๋„ BlockInput() ํ•จ์ˆ˜๋ฅผ ํŒจ์น˜ ํ•˜๋Š” ์˜ต์…˜์ด ์ž‡์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ CTRL+ALT+DELETE ๋ฅผ ๋ˆŒ๋Ÿฌ ์ˆ˜๋™์œผ๋กœ ์ •์ง€๋ฅผ ํ•ด์ œ ํ• ์ˆ˜๋„ ์ž‡์Šต๋‹ˆ๋‹ค.

5.3 ThreadHideFromDebugger

์ด ๊ธฐ์ˆ ์€ thread's priority ๋ฅผ ์„ค์ •ํ•˜๋Š” ntdll!NtSetInformationThread() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด API ํ•จ์ˆ˜๋Š” ๋””๋ฒ„๊น…์„ ๋ฐฉ์ง€ ํ• 

์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

NtSetInformationThread() ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด TheadHideFromDebugger (0x11)์„

ThreadInformationClass ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉ ํ•˜์—ฌ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ThreadHandle ์€ ์ท๋ฐ˜์ ์œผ๋กœ (0xfffffffe) ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ

์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

NTSTATUS NTAPI NtSetInformationThread(

HANDLE ThreadHandle,

THREAD_INFORMATION_CLASS ThreadInformationClass,

Page 42: [The Art of Unpacking]

42 | ํŽ˜ ์ด ์ง€

PVOID ThreadInformation,

ULONG ThreadInformationLength

);

์ปค๋„๊ตฌ์กฐ์ฒด์˜ ETHREAD ์˜ HideThreadFromDebugger ํ•„๋“œ๋Š” ThreadHideFromDebugger ์— ์˜ํ•ด ์„ค์ • ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค์ •์ด ๋œ ํ›„ ๋‚ด๋ถ€์˜ ์ปค๋„ํ•จ์ˆ˜ _DbgkpSendApiMessage() ๋Š” ์ด๋ฒขํŠธ๋ฅผ ๋””๋ฒ„๊ฑฐ์—๊ฒŒ ๋ณด๋‚ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

NtSetInformationThread() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ‚ํ˜•์ ์ถ ์˜ˆ์ œ:

push 0 ;InformationLength

push NULL ;ThreadInformation

push ThreadHideFromDebugger ;0x11

push 0xfffffffe ;GetCurrentThread()

call [NtSetInformationThread]

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ntdll!NtSetInformaionThread() ํ•จ์ˆ˜์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” EIP ๋ฅผ

์กฐ์ž‘ํ•˜์—ฌ API ๊ฐ€ ์ปค๋„์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ollyscript ๋ฅผ ํ†ตํ•˜์—ฌ ์ž๋™์œผ๋กœ ํ•  ์ˆ˜๋„ ์ž‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Olly

Advanced ํ”Œ๋Ÿฌ๊ทธ์ถ ์—์„œ๋„ ์„ ํƒํ•˜์—ฌ ํŒจ์น˜ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด API ๋Š” ThreadInformationClass ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€

HideThreadFromDebugger ๋กœ ์„ค์ •๋˜๋ฉด ์ปค๋„ ์ฝ”๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  ๋‹จ์ˆšํžˆ ๋ฆฌํ„ด ํ•ด์ค๋‹ˆ๋‹ค.

5.4 Disabling Breakpoints

๋””๋ฒ„๊น…ํˆด์„ ๊ณต๊ฒฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ํŒจ์ปค๋Š” CONTEXT ๊ตฌ์กฐ์ฒด๋ฅผ ํ†ตํ•˜์—ฌ

๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ธˆ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.

์˜ˆ์ œ

์ด ์˜ˆ์ œ์—์„œ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์˜ CONTEXT ๋ ˆ์ฝ”๋“œ๋ฅผ ์ ‚๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๋””๋ฒ„๊ทธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋น„์›๋‹ˆ๋‹ค:

; set up exception handler

Page 43: [The Art of Unpacking]

43 | ํŽ˜ ์ด ์ง€

push .exception_handler

push dword [fs:0]

mov [fs:0],esp

; throw an exception

xor eax,eax

mov dword [eax],0

; restore exception handler

pop dword [fs:0]

add esp,4

:::

.exception_handler

;EAX = CONTEXT record

mov eax,[esp+0xc]

;Clear Debug Registers: Context .Dr0-Dr3,Dr6,Dr7

mov dword [eax+0x04].0

mov dword [eax+0x08].0

mov dword [eax+0x0c].0

mov dword [eax+0x10].0

mov dword [eax+0x14].0

mov dword [eax+0x18].0

;set Context.EIP upon return

add dword [eax+0xb8],6

Page 44: [The Art of Unpacking]

44 | ํŽ˜ ์ด ์ง€

xor eax,eax

retn

์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ์— ๋Œ€ํ•˜์—ฌ ํŒจ์ปค๋Š” ์ง์ ‘ INT3(0xCC)๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์ž‡๊ณ  ์ž„์˜์˜ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋Š” ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ •ํ™•ํžˆ ํ•˜๋“œ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ๊ฒ€์ธก ๋œ ๊ฒฝ์šฐ์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๋งŠ์•ฝ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘

๊ฒ€์ธก ๋œ๋‹ค๋ฉด ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ์˜ on-memory access/write ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

5.5 Unhandled Exception Filter

MSDN ์—์„œ๋Š” ํ•˜๋‚˜์˜ ์˜ˆ์™ธ๋กœ unhandled exception filter(kernel32!UnhandledExceptionFilter)์— ๋„๋‹ฌํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ๋””๋ฒ„๊น…์ด

๋˜์ง€ ์•Š์•˜์„ ๋•Œ unhandled exception filter ๋Š” top level exception filter ์„ ๋ถˆ๋Ÿฌ์™€์„œ Kernel32!SetUnhandledExceptionFilter()

ํ•จ์ˆ˜ ์•†์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค๊ณ  ๋‚˜์™€์ž‡์Šต๋‹ˆ๋‹ค.. ํŒจ์ปค๋Š” ์ด์ ์„ ์ด์šฉํ•˜์—ฌ exception filter ๋ฅผ ์„ค์ •ํ•œ ๋’ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋งŠ์•ฝ

๋””๋ฒ„๊น…์ค‘ ์ด๋ผ๋ฉด ์ด ์˜ˆ์™ธ๋ฅผ ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด exception filter ๋กœ ์ ‚์†ก ๋˜์–ด ๊ณ„์† ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” SetUnhandledExceptionFilter()์„ ์ด์šฉํ•˜์—ฌ top level exception filter ๋ฅผ ์„ค์ •ํ•˜๊ณ  access violation ์„

๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋ฉด ๋””๋ฒ„๊ฑฐ๋Š” ๋‘ ๊ฐœ์˜ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ณ  ๋””๋ฒ„๊น…์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด exception filter

๋Š” CONTEXT.EIP ๋กœ ์„ค์ •๋˜์–ด ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

;set the exception filter

push .exception_filter

call [SetUnhandledExceptionFilter]

mov [.original_filter],eax

;throw an exception

xor eax,eax

mov dword [eax],0

Page 45: [The Art of Unpacking]

45 | ํŽ˜ ์ด ์ง€

;restore exception filter

push dword [.original_filter]

call [SetUnhandledExceptionFilter]

:::

.exception_filter:

;EAX = ExceptionInfo.ContextRecord

mov eax,[esp+4]

mov eax,[eax+4]

;set return EIP upon return

add dword [eax+0xb8],6

;return EXCEPTION_CONTINUE_EXECUTION

mov eax,0xffffffff

retn

์–ด๋–ค ํŒจ์ปค๋Š” SetUnhandledExceptionFilter() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ž kernel32!_BasepCurrentTopLevelFilter ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ

exception filter ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๊ฐ€ ์ด API ๋ธŒ๋ ˆ์ดํฌ ํฌ์ถํŠธ๋ฅผ ๊ฑฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ kernel32!UnhandledExceptionFilter() ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ์•†์—์„œ ntdll!NtQueryInformationProcess (ProcessDebugPort)๋ฅผ

์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น… ์ค‘์ถ์ง€ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋กœ๋ถ€ํ„ฐ ๋“ฑ๋ก๋œ exception filter ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ ์ถ์ง€ ์•„๋‹Œ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ

DebugPort ๋””๋ฒ„๊ฑฐ ๊ฒ€์‚ฌ ๊ธฐ์ˆ ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

5.6 OllyDbg:OutputDebugStrion() Format String Bug

์ด ๋””๋ฒ„๊ฑฐ ๊ณต๊ฒฉ ์€ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ์—์„œ๋งŠ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ๋Š” ์•„์‹œ๋‹ค์‹œํ”ผ ํฌ๋งท ์ŠคํŠธ๋ง ๋ฒ„๊ทธ์˜ ์ทจ์•ฝ์ ์„ ๊ฐ€์ง€๊ณ  ์ž‡์Šต๋‹ˆ๋‹ค.

์ด ๋ฒ„๊ทธ๋Š” kernel32!OutputDebugString() ํ•จ์ˆ˜์— ๋น„์ •์ƒ์ ์ถ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฃผ๊ฒŒ๋˜๋ฉด ์ท์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋Š”

Page 46: [The Art of Unpacking]

46 | ํŽ˜ ์ด ์ง€

์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ(1.10)์—์„œ ์•„์ง๋„ ์กด์žฌํ•˜๊ณ  ์ž‡์œผ๋ฉฐ ํŒจ์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

์ด ๊ฐ‚๋‹จํ•œ ์˜ˆ์ œ๋Š” ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๊ฐ€ access violation ๋˜๋Š” ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์ข…๋ฃŒ๋ฅผ ์ท์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Push .szFormatSting

call [OutputDebugSringA]

:::

.szFormatString db "%s%s",0

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

kerne32!OutputDebugStringA() ์˜ ์—”ํŠธ๋ฆฌ๋ฅผ ํŒจ์น˜ ํ•ด์ค˜์„œ ์ง์ ‘์ ์œผ๋กœ ๋ฆฌํ„ด ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

6.TECHNIQUES:ADVANCED AND OTHER TECHNIQUES

์ด๋ฒˆ ์žฅ ์—์„œ๋Š” ์•ž์—์„œ์˜ ์žฅ์— ์†ํ•˜์ง€ ์•Š๋Š” ๊ธฐ์ˆ ๋“ค๊ณผ ๋” ๊ณ ๊ธ‰๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด์„œ ์—ด๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

6.1 Process Injection

ํ”„๋กœ์„ธ์Šค ์ถ์žญ์…˜์€ ์ด๋ฏธ ๋ช‡๋ช‡ ํŒจ์ปค๋“ค์˜ ํŠน์ง•์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ง•๊ณผ ๋”๋ถˆ์–ด ํŒจํ‚น์„ ํ‘ธ๋Š” ์ฝ”๋“œ๋Š” ํŠน์ •ํ•œ ํ˜ธ์ŠคํŠธํ”„๋กœ์„ธ์Šค(์˜ˆ:

์ž๊ธฐ ์ž์‹ž, explorer.exe, iexplorer.exe, ๊ธฐํƒ€๋“ฑ๋“ฑ)๋ฅผ ์„ ํƒํ•œ ๋’ค ํ˜ธ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค ์•†์— ์–ธํŒจํ‚น๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ํ”„๋กœ์„ธ์Šค ์ถ์ ์…˜์„ ์ง€์›ํ•˜๋Š” ํŒจ์ปค์˜ ์Šคํฌ๋ฆฎ์ƒท ์ž…๋‹ˆ๋‹ค.

Page 47: [The Art of Unpacking]

47 | ํŽ˜ ์ด ์ง€

์•…์„ฑ์ฝ”๋“œ๋Š” ํŒจ์ปค์˜ ์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์ด์šฉํ•˜์—ฌ ๋ช‡๋ช‡ ๋ฐฉํ™”๋ฒฝ์„ ์šฐํšŒํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ์ด๋Ÿฐ ๋ฐฉํ™”๋ฒฝ์€ ํ”„๋กœ์„ธ์Šค ์•†์— ์„œ ๋„คํŠธ์›Œํฌ

์—ฐ๊ฒฐ์˜ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

ํŒจ์ปค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ถ์ ์…˜์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. kernel32!CreateProcess() ์— CREATE_SUSPENDED ์˜ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„˜๊ฒจ์ฃผ์–ด์„œ ํ˜ธ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹

ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŠ๋“œ๋Š” ๊ฒƒ์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋•Œ ํ•˜๋‚˜์˜ ์ดˆ๊ธฐํ™”๋œ ์“ฐ๋ž˜๋“œ๊ฐ€ ๋งŠ๋“ค์–ด์ง€๊ณ  ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. DLL ๋“ค์€ ์—ฌ์ ‚ํžˆ ๋กœ๋”

๋ฃจํ‹ด(ntdll!LrdInitializeThunk)์ด ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š์•„์„œ ๋กœ๋“œ ๋˜์–ด์ž‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ์“ฐ๋ž˜๋“œ๋Š” PEB ์ฃผ์†Œ์˜ ์ •๋ณด์™€ ํ˜ธ์ŠคํŠธ

ํ”„๋กœ์„ธ์Šค์˜ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

2. kernel32!GetThreadContext() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ํ”„๋กœ์„ธ์Šค์˜ ์ดˆ๊ธฐํ™” ์“ฐ๋ž˜๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

3. CONTEXT.EBX ๋ฅผ ํ†ตํ•˜์—ฌ PEB ์ฃผ์†Œ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

4. PEB.ImageBase(PEB+0x8)๋ฅผ ์ธ์–ด์„œ ์ž์‹ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฏธ์ง€ ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

5. ์ž์‹ํ”„๋กœ์„ธ์Šค ์•†์˜ ์›๋ž˜์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฏธ์ง€๊ฐ€ ntdll!NtUnmapViewOfSection() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ unmap ํ•  ๋•Œ BaseAddress

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€ ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

6. ํŒจํ‚น์„ ํ‘ธ๋Š” ์ฝ”๋“œ๊ฐ€ kernel32!VirtualAllocEx() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ํ”„๋กœ์„ธ์Šค ์•†์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ dwSize ํŒŒ๋ผ๋ฏธํ„ฐ๋Š”

์–ธํŒจํ‚น๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

7. kernel32!WriteProcessMemory() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ธํŒจํ‚น๋œ ํ”„๋กœ๊ทธ๋žจ์˜ PE ํ—ค๋”์™€ ์„น์…˜์— ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์จ ๋„ฃ์Šต๋‹ˆ๋‹ค.

Page 48: [The Art of Unpacking]

48 | ํŽ˜ ์ด ์ง€

8. PEB.ImageBase ์˜ ์ž์‹ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์–ธํŒจํ‚น๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ด๋ฏธ์ง€ ๋ฒ ์ด์Šค๋ž‘ ์ท์น˜ํ•ฉ๋‹ˆ๋‹ค.

9. kernel32!SetThreadContext()์„ ํ†ตํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ดˆ๊ธฐํ™” ์“ฐ๋ ˆ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด ์ค‘์˜ CONTEXT.EAX ๋ฅผ ํŒจํ‚น์„

ํ‘ผํ›„์˜ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

10. kernel32!ResumeThread()๋ฅผ ํ†ตํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ๋ฒ„์„œ๋Š” WriteProcessMemory() ํ•จ์ˆ˜์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ

์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ๋ฅผ ๋‹ด๊ณ  ์ž‡๋Š” ์„น์…˜์—์„œ ์ž์‹ํ”„๋กœ์„ธ์Šค๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ ์˜ ์ฝ”๋“œ๋Š”

(โ€œ์ž๊ธฐ์ž์‹ž์œผ๋กœ ์ ํ”„โ€) (0xEB 0xFE)๋ช…๋ น์–ด๋กœ ํŒจ์น˜ ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ถ ์“ฐ๋ ˆ๋“œ์˜ ์ž์‹ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žฌ๊ฐœ๋  ๋•Œ ์ž์‹ํ”„๋กœ์„ธ์Šค๋Š” ์—”ํŠธ๋ฆฌ

ํฌ์ถํŠธ A ์—์„œ ๋์—†๋Š” ๋ฐ˜๋ณต ๊ตฌ๊ฐ‚์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ณต๊ตฌํ•˜๊ฒŒ ๋˜๋ฉด ๊ณ„์†ํ•ด์„œ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

6.2 Debugger Blocker

Armadillo ํŒจ์ปค๋Š” Debugger Blocker ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฆฌ๋ฒ„์„œ๊ฐ€ ๋ณดํ˜ธ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ดํƒœ์น˜

ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค. ์ด ๋ณดํ˜ธ๋Š” ์œˆ๋„์šฐ์ฆˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋””๋ฒ„๊น… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ํŒจํ‚น์„ ํ‘ธ๋Š” ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ๋””๋ฒ„๊ฑฐ(๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค) ์—ญํ• ์„ ํ•˜๊ณ  ์ด๊ฒƒ์„ ํ†ตํ•ด ์–ธํŒฉ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ด๊ณ  ์ž‡๋Š”

๊ฒƒ์„ ์ž์‹ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋””๋ฒ„๊ทธ/์ปจํŠธ๋กŸ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ˜ธ๋ฐ›๊ณ  ์ž‡๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์ด๋ฏธ ๋””๋ฒ„๊น…์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— kernel32!DebugActiveProcess()๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊ฑฐ๋กœ ์–ดํƒœ์น˜ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด

์‹คํŒจํ• ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ native API ์ถ ntdll!NtDebugActiveProcess() ๊ฐ€ STATUS_PORT_ALREADY_SET ์„ ๋ฆฌํ„ด ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

NtDebugActiveProcess() ๊ฐ€ ์‹คํŒจํ•œ ์›์ถ์€ ์ปค๋„ ๊ตฌ์กฐ์ฒด์ถ EPROCESS ์˜ DebugPort ํ•„๋“œ๊ฐ€ ์ด๋ฏธ ์„ค์ •๋˜์ž‡๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Page 49: [The Art of Unpacking]

49 | ํŽ˜ ์ด ์ง€

๋ณดํ˜ธ๋ฐ›๊ณ  ์ž‡๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น… ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ช‡๋ช‡์˜ ๋ฆฌ๋ฒ„์‹ฑ ํฌ๋Ÿผ์—์„œ ๋ฐœํ‘œํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ์•†์—์„œ

Kernel32!DebugActiveProcessStop()์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ดํƒœ์นญ ํ•  ๋””๋ฒ„๊ฑฐ์˜ ๋ถ€๋ชจํ”„๋กœ์„ธ์Šค์—์„œ kernel32!WaitForDebugEvent() ๋‚ด๋ถ€์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์€ ๋’ค ์‹คํ–‰ํ•˜์—ฌ

๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๊ฐ€ ๊ฑธ๋ฆฏ ๋•Œ DebugActiveProcessStop(ChildProcessPID)๋ฅผ ๋ถˆ๋Ÿฌ๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์„œ ์‹คํ–‰ํ•˜๋ฉด ๋””๋ฒ„๊ฑฐ๋Š” ๋ณดํ˜ธ๋ฐ›๊ณ 

์ž‡๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ดํƒœ์นญ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

6.3 TLS Callbacks

๋˜ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์€ ํŒจ์ปค๊ฐ€ ์‹ค์ œ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ๋ฅผ ์‹คํ–‰ ํ•˜๊ธฐ์ ‚์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Thread Local Storage(TLS)

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค. ํŒจ์ปค๊ฐ€ ๋””๋ฒ„๊ฑฐ ์ฒดํฌ ๋‚˜ ๋ณตํ˜ธํ™” ๋ฃจํ‹ด์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•†์— ๋„ฃ๋Š” ๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ๋Š” ์ด

๋ฃจํ‹ด๋“ค์„ ํŠธ๋ ˆ์ด์‹ฑ ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

TLS ์ฝœ๋ฐฑ์€ pedump ์™€ ๊ฐ™์€ PE ํŒŒ์ท ๋ถ„์„ํˆด๋กœ ์‹๋ณ„ ํ•  ์ˆ˜ ์ž†์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ํŒŒ์ท ์•†์— TLS ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด Data

๋””๋ ‰ํ† ๋ฆฌ ์•†์—์„œ ๋ณผ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

Data Directory

EXPORT rva: 00000000 size: 00000000

IMPORT rva: 00061000 size: 000000E0

:::

TLS rva: 000610E0 size: 00000018

:::

IAT rva: 00000000 size: 00000000

DELAY_IMPORT rva: 00000000 size: 00000000

COM_DESCRPTR rva: 00000000 size: 00000000

unused rva: 00000000 size: 00000000

TLS ๋””๋ ‰ํ† ๋ฆฌ์˜ ์‹ค์ œ ๋‚ด์šฉ๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. AddressOfCallBacks ํ•„๋“œ ํฌ์ถํŠธ๋“ค์€ null ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ ๊ณผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์˜

๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค:

TLS directory:

StartAddressOfRawData: 00000000

EndAddressOfRawData: 00000000

Page 50: [The Art of Unpacking]

50 | ํŽ˜ ์ด ์ง€

AddressOfIndex: 004610F8

AddressOfCallBacks: 004610FC

SizeOfZeroFill: 00000000

Characteristics: 00000000

์ด ์˜ˆ์ œ์—์„œ RVA 0x4610fc ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํฌ์ถํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.(0x490f43 , 0x44654e):

๊ธฐ๋ณธ์ ์œผ๋กœ, ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋กœ ์˜ˆ์ œ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋ฉด ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ์—์„œ ๋ฉˆ์ถœ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ์— ๋„์ฐฉ ํ•˜๊ธฐ์ ‚์— TLS

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์€ ์ด๋ฏธ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ์—์„œ TLS ์ฝœ๋ฐฑ์„ ๋ถˆ๋Ÿฌ ์˜ค๊ธฐ์ ‚์— ์ค‘๋‹จ๋œ ์‹ค์ œ loader ์—์„œ ์ •์ง€ํ•˜๋„๋ก

์„ค์ •ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Option -> Debugging Option -> Events -> Make First pause at -> System breakpoint.

์ด๋Ÿฌํ•œ ์„ค์ •์„ ํ†ตํ•˜์—ฌ ntdll.dll ์•†์—์„œ ์ค‘๋‹จ๋œ ์‹ค์ œ loader ์ฝ”๋“œ์—์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ค์ • ํ•œ ํ›„์— ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋Š” TLS ์ฝœ๋ฐฑ์˜ ntdll!_LdrpRunInitializeRoutines() ์ ‚์˜ ntdll!_LdrpInitializeProcess() ๋กœ ์‹คํ–‰๋œ

์ž๋ฆฌ์—์„œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑธ์–ด ํŠธ๋ ˆ์ด์‹ฑ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

PE ํŒŒ์ท ํฌ๋งท์˜ ๋” ๋ง‹์€ ์ •๋ณด ์™€ pedump ์˜ ์‹คํ–‰ํŒŒ์ท/์†Œ์Šค ๋Š” ์•„๋ž˜์˜ ๋งํฌ์—์„œ ๊ตฌํ•˜์‹ค ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค:

An In-Depth Look into the Win32 Portable Executable File Format by Matt Pietrek

http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx

An In-Depth Look into the Win32 Portable Executable File Format,Part 2 by Matt Pietrek

Page 51: [The Art of Unpacking]

51 | ํŽ˜ ์ด ์ง€

http://msdn.microsoft.com/msdnmag/issues/02/03/PE2/

์ตœ์‹ž๋ฒ„์ ผ์˜ PE ํŒŒ์ท ํฌ๋งท ์€ ์•„๋ž˜ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค:

microsoft Portable Executable and Common Object File Format Specification

http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx

6.4 Stolen Bytes

Stolen Bytes ๋Š” ํŒจ์ปค๊ฐ€ ์ด๋™์‹œํ‚จ ๋ณดํ˜ธ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ์˜ ์ท๋ถ€๋ถ„(๋ณดํ†ต์€ ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ์˜ ๋ช‡ ๊ฐœ์˜ ๋ช…๋ น์–ด)์ž…๋‹ˆ๋‹ค. ์ด

๋ถ€๋ถ„์˜ ๋ช…๋ น์–ด๋Š” ์ด๋™๋œ ๊ณณ ์ด๋‚˜ ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ‚์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ณดํ˜ธ๋œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋คํ”„ ๋˜์—ˆ์„ ๋•Œ Stolen

Bytes ๋ฅผ ๋ณต๊ตฌ ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๋คํ”„๋œ ์‹คํ–‰ํŒŒ์ท์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์ด ์˜ˆ์ œ๋Š” ์‹คํ–‰๋  ์ˆ˜ ์ž‡๋Š” ํŒŒ์ท์˜ ์˜ค๋ฆฌ์ง€๋‚  ์—”ํŠธ๋ฆฌ ํฌ์ถํŠธ(OEP)์ž…๋‹ˆ๋‹ค:

004011CB MOV EAX,DWORD PTR FS:[0]

004011D1 PUSH EBP

004011D2 MOV EBP,ESP

004011D4 PUSH -1

004011D6 PUSH 0047401C

004011DB PUSH 0040109A

004011E0 PUSH EAX

004011E1 MOV EWORD PTR FS:[0],ESX

004011E8 SUB ESP,10

004011EB PUSH EBX

004011EC PUSH ESI

004011ED PUSH EDI

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜๋Š” Enigma Protector ํŒจ์ปค๋กœ ํŒจํ‚นํ•˜์—ฌ ์•ž๋ถ€๋ถ„์˜ ๋‘ ๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ํ›”์ณ๋‚ธ ๋™์ทํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:

004011CB POP EBX

004011CC CMP EBX,EBX

Page 52: [The Art of Unpacking]

52 | ํŽ˜ ์ด ์ง€

004011CE DEC ESP

004011CF POP ES

004011D0 JECXZ SHORT 00401169

004011D2 MOV EBP,ESP

004011D4 PUSH -1

004011D6 PUSH 0047401C

004011DB PUSH 0040109A

004011E0 PUSH EAX

004011E1 MOV DWORD PTR FS:[0],ESP

004011E8 SUB ESP,10

004011EB PUSH EBX

004011EC PUSH ESI

004011ED PUSH EDI

์ด ๊ฒƒ์€ ASProtect ํŒจ์ปค๋กœ ๋ช‡ ๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ํ›”์นœ ๋™์ทํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. jump ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ›”์ณ์ง‚ ๋ช…๋ น์–ด์˜ ์‹คํ–‰ ๋ฃจํ‹ด์„

๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค. ํ›”์ณ์ง‚ ๋ช…๋ น์–ด์™€ ์“ฐ๋ ˆ๊ธฐ ์ฝ”๋“œ๊ฐ€ ํ•จ๊ป˜ ์ž‡์œผ๋ฉด ํ›”์ณ์ง‚ ๋ช…๋ น์–ด๋ฅผ ๋ณต๊ตฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

004011CB JMP 00B70361

004011D0 JNO SHORT 00401198

004011D3 INC EBX

004011D4 ADC AL,0B3

004011D6 JL SHORT 00401196

004011D8 INT1

004011D9 LAHF

004011DA PUSHFD

004011DB MOV EBX,1D0F0294

004011E0 PUSH ES

004011E1 MOV EBX,A732F973

004011E6 ADC BYTE PTR DS:[EDX-E],CH

Page 53: [The Art of Unpacking]

53 | ํŽ˜ ์ด ์ง€

004011E9 MOV ECX,EBP

004011EB DAS

004011EC DAA

004011ED AND DWORD PTR DS:[EBX+58BA76D7],ECX

6.5 API Redirection

API ๋ฆฌ๋‹ค์ด๋ ‰์…˜์€ ๋ฆฌ๋ฒ„์„œ๋“ค์ด ๋ณดํ˜ธ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž„ํฌํŠธ ํ…Œ์ด๋ธ”์„ ์‰ฝ๊ฒŒ ๋ฆฌ๋นŒ๋”ฉ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฆฌ์ง€๋‚  ์ž„ํฌํŠธ ํ…Œ์ด๋ธ”์€ ํŒŒ๊ดด๋˜๊ณ  ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์•†์— ๋ถˆ๋Ÿฌ์˜จ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๋Š” API ๋“ค์˜ ๋ฃจํ‹ด๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฃจํ‹ด๋“ค์€

API ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” kernel32!CopyFileA() ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค:

00404F05 LEA EDI,DWORD PTR SS:[EBP-20C]

00404F0B PUSH EDI

00404F0C PUSH DWORD PTR SS:[EBP-210]

00404F12 CALL <JMP.&KERNEL32.CopyFileA>

call ๋Œ€์‹ž JMP ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ ํ”„ํ•˜๋Š”๊ณณ์˜ ์ฃผ์†Œ๋Š” ์ž„ํฌํŠธ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

004056B8 JMP DWORD PTR DS:[<&KERNEL32.CopyFileA>]

๊ทธ๋Ÿฌ๋‚˜ ASProtect ํŒจ์ปค๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ kernel32!CopyFileA() ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ CALL ๋ฃจํ‹ด์œผ๋กœ ์ˆ˜์ • ๋˜์–ด

kernel32!CopyFileA() ์˜ ํ›”์ณ์ง‚ ๋ช…๋ น์€ ๊ฒฐ๊ตญ ๊ฐ€์žฅ์ค‘์š”ํ•œ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค.

004056B8 CALL 00D90000

์•„๋ž˜ ์„ค๋ช…์€ ํ›”์ณ์ง‚ ๋ช…๋ น์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ 7 ๊ฐœ์˜ ๋ช…๋ น์–ด๋“ค์€ kernel!CopyFileA() ์ฝ”๋“œ์—์„œ ๋ณต์‚ฌ๋œ

๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ์•†์˜ 0x7C83005E ์„ ์ฝœ ํ•˜๋Š” ๋ถ€๋ถ„ ๋˜ ํ•œ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. RETN ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•˜์—ฌ kernel32.dll ์•†์˜

kernel32!CopyFileA() ๋ฃจํ‹ด ์ค‘๊ฐ‚์ถ 0x7C830063 ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค:

Page 54: [The Art of Unpacking]

54 | ํŽ˜ ์ด ์ง€

์–ด๋–ค ํŒจ์ปค๋Š” ๋” ๋จผ ๊ณณ์˜ ์ ‚์ฒด DLL ์ด๋ฏธ์ง€๋ฅผ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ API ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์•†์—์„œ

DLL ์ด๋ฏธ์ง€๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์‹ค์ œ API ํ•จ์ˆ˜์— ๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ๋ฅผ ๊ฑฐ๋Š” ๊ฒƒ์„ ์–ด๋ ต๊ฒŒ ๋งŠ๋“œ๋Š” ํšจ๊ณผ๊ฐ€ ์ž‡์Šต๋‹ˆ๋‹ค.

6.6 Multi-Threaded Packers

๋ฉ€ํ‹ฐ์“ฐ๋ž˜๋””๋“œ ํŒจ์ปค์—์„œ ๋˜๋‹ค๋ฅธ ์“ฐ๋ž˜๋“œ๋Š” ๋ณดํ˜ธ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณตํ˜ธํ™” ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ช‡๋ช‡ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์“ฐ๋ž˜๋””๋“œ ํŒจ์ปค์˜ ๋ณต์žก๋„๋Š” ์ฆ๊ฐ€ํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ์„œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๋„ ๋งค์šฐ ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์“ฐ๋ž˜๋””๋“œ ํŒจ์ปค์˜ ํ•œ๊ฐ€์ง€ ์˜ˆ๋กœ๋Š” PECrypt ๊ฐ€ ์ž‡์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ๋‘๋ฒˆ์งธ ์“ฐ๋ž˜๋“œ๋Š” ๋ณตํ˜ธํ™” ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ๋ฉ”์ถ ์“ฐ๋ž˜๋“œ๋Š” ์ด

๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์“ฐ๋ž˜๋“œ๋Š” ์‹ค์‹œ๊ฐ‚์œผ๋กœ ์ง‚ํ–‰๋ฉ๋‹ˆ๋‹ค.

PECrypt ์—์„œ ์“ฐ๋ž˜๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ:

6.7 Virtual Machines

๊ฐ€์ƒ ๋จธ์‹ž์„ ์‚ฌ์šฉํ•œ ์ด ๊ฐœ๋…์€ ์•„์ฃผ ๊ฐ‚๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์„œ๋Š” ์ตœ์ข…์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์šฐํšŒ/์•†ํ‹ฐ๋””๋ฒ„๊น…, ์•†ํ‹ฐ๋ฆฌ๋ฒ„์‹ฑ์˜ ๊ธฐ์ˆ ์„ ํ•ด๊ฒฐํ• 

๊ฒƒ์ถ๊ฐ€๋ฅผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ˜ธ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฉ”๋ชจ๋ฆฌ์•†์—์„œ ๋ณตํ˜ธํ™” ๋ฐ ์‹คํ–‰๋  ๋•Œ ์ •์ ๋ถ„์„์„ ํ•˜๋ฉด ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.

Page 55: [The Art of Unpacking]

55 | ํŽ˜ ์ด ์ง€

๊ฐ€์ƒ ๋จธ์‹ž์˜ ์ถœํ˜„์œผ๋กœ ๋ณดํ˜ธ๋œ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ p-code ๋กœ ๋ณ€ํ™–๋˜์–ด p-code ๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™–๋˜์–ด์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์›๋ž˜์˜ ๊ธฐ๊ณ„

๋ช…๋ น์–ด๋Š” ์น˜ํ™–๋˜๊ณ  ์ฝ”๋“œ ํ•ด์„์˜ ๋ณต์žก๋„๋„ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์ด ๊ฐœ๋…์˜ ๊ฐ‚๋‹จํ•œ ๊ทธ๋ฆฐ์ž…๋‹ˆ๋‹ค:

Oreans technologies ์˜ CodeVirtualizer ์™€ StarForce ์™€ ๊ฐ™์€ ์ตœ์‹ž ํŒจ์ปค๋„ ๊ฐ€์ƒ ๋จธ์‹ž์˜ ๊ฐœ๋…์„ ์‘์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณดํ˜ธ

ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋จธ์‹ž์— ๋Œ€์‘ํ•˜๋ ค๋ฉด ๋ถ„์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. p-code ๊ฐ€ ๊ฐ€์ƒ ๋จธ์‹ž์— ์˜ํ•ด ๋ณ€ํ™–๋œ ๊ตฌ์กฐ๋ผ๋ฉด ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์–ป์€ ํ›„ p-code ๋ฅผ

๋ถ„์„ํ•˜์—ฌ ์ด๊ฒƒ์„ ๊ธฐ๊ณ„์–ด ๋˜๋Š” ์ดํ•ดํ•  ์ˆ˜ ์ž‡๋Š” ๋ช…๋ น์–ด๋กœ ๋ณ€ํ™–ํ•˜๋Š” ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

p-code ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์˜ˆ์ œ์™€ ๊ฐ€์ƒ๋จธ์‹ž์ด ์‹คํ–‰๋œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ํ†ตํ•˜์—ฌ ์–ป์„์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค:

Defeating HyperUnpackMe2 With an IDA Processor Module, Rolf Rolles III

http://www.openrce.org/articles/full_view/28

7. TOOLS

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ๋ฆฌ๋ฒ„์„œ๋‚˜ ์•…์„ฑ์ฝ”๋“œ ๋ถ„์„์›๋“ค์ด ํŒจ์ปค๋ฅผ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ์–ธํŒจํ‚น์„ ํ•  ๋•Œ ๊ณต๊ฐœ์ ์œผ๋กœ ์“ฐ๋Š” ํˆด์— ๋Œ€ํ•ด ์—ด๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ•„๋…: ์ด๊ฒƒ์€ ๋ชจ๋‘ ์ œ 3 ์ž์˜ ํˆด์ž…๋‹ˆ๋‹ค; ํ•„์ž๋Š” ์ด ํˆด ์‚ฌ์šฉ์œผ๋กœ ์ถํ•œ ์‹œ์Šคํ…œ์˜ ๋ถˆ์•†์ •์ด๋‚˜ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ฑ…์ž„

์„ ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋˜๋Š” ์•…์„ฑ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ํ™–๊ฒฝ์—๋งŠ ์ด ํˆด์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ฑด์˜ ํ•ฉ๋‹ˆ๋‹ค.

7.1 OllyDbg

http://www.ollydbg.de/

Page 56: [The Art of Unpacking]

56 | ํŽ˜ ์ด ์ง€

๋ฆฌ๋ฒ„์„œ์™€ ์•…์„ฑ์ฝ”๋“œ ๋ถ„์„์ž๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ring 3 ๋ชจ๋“œ ๋””๋ฒ„๊ฑฐ์ž…๋‹ˆ๋‹ค. ์ด ํˆด์˜ ํ”Œ๋Ÿฌ๊ทธ์ถ์„ ๋ฆฌ๋ฒ„์„œ๋“ค์ด ๋งŠ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์ด

๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด๊ฒƒ์„ ์ด์šฉํ•˜๋ฉด ๋ฆฌ๋ฒ„์‹ฑ๊ณผ ์–ธํŒจํ‚น์„ ํ‘ธ๋Š”๊ฒƒ์ด ๋”์šฑ ์‰ฝ์Šต๋‹ˆ๋‹ค.

7.2 Ollyscript

http://www.openrce.org/downloads/details/106/OllyScript

์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ์Šคํฌ๋ฆฑํŠธ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฑํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ์„ค์ •/๋ธŒ๋ ˆ์ดํฌํฌ์ถํŠธ ํ•ธ๋“ค๋ง, ์ฝ”๋“œ/๋ฐ์ดํ„ฐ ํŒจ์น˜ ๋“ฑ์„ ํ•  ์ˆ˜

์ž‡์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž‘์—…์ด๋‚˜ ์ž๋™์œผ๋กœ ์–ธํŒจํ‚น์„ ํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

7.3 Olly Advanced

http://www.openrce.org/downloads/details/241/Olly_Advanced

๋ฆฌ๋ฒ„์„œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๋งŠ์•ฝ ํŒจ์ปค๋ผ๋Š” ๊ฐ‘์˜ท์ด ์ž‡๋‹ค๋ฉด ๋ฆฌ๋ฒ„์„œ์—๊ฒŒ๋Š” ์ด ํ”Œ๋Ÿฌ๊ทธ์ถ์ด ๋””๋ฒ„๊น…ํˆด์˜ ๊ฐ‘์˜ท์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ

๊ฐ€์ง€ ์˜ต์…˜์œผ๋กœ ์•†ํ‹ฐ๋””๋ฒ„๊น… ๊ธฐ์ˆ ์„ ์šฐํšŒํ•˜๊ณ  ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ๋ฅผ ํŒจ์ปค๋กœ ๋ถ€ํ„ฐ ์ˆจ๊ฒจ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Page 57: [The Art of Unpacking]

57 | ํŽ˜ ์ด ์ง€

7.4 OllyDump

http://www.openrce.org/downloads/details/108/OllyDump

์„ฑ๊ณต์ ์œผ๋กœ ์–ธํŒฉ์„ ํ•œ ํ›„์— ์ด ํ”Œ๋Ÿฌ๊ทธ์ถ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋คํ”„ ํ•œ ๋’ค ์ž„ํฌํŠธ ํ…Œ์ด๋ธ”์„ ๋ฆฌ๋นŒ๋”ฉ ํ•ฉ๋‹ˆ๋‹ค.

7.5 ImpRec

http://www.woodmann.com/crackz/Unpackers/Imprec16.zip

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋คํ”„ ํ•˜๊ฑฐ๋‚˜ ์ž„ํฌํŠธ ํ…Œ์ด๋ธ”์„ ๋ณต๊ตฌํ•˜๋Š” ํˆด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ํ›Œ๋ฅญํ•œ ์ž„ํฌํŠธ ํ…Œ์ด๋ธ” ๋ณต๊ตฌ

ํˆด์ž…๋‹ˆ๋‹ค.

8. REFERENCES

์„œ์  : Reverse Engineering, Software Protection

โฆReversing: Secrets of Reverse Engineering. E.Eilam.Wiley, 2005

โฆCrackproof Your Software , P.Cerven.No Starch Press, 2002

์„œ์  : Windows and Processor Internal

โฆMicrosoft Windows Internal, 4th Edition . M. Russinovich, D. Solomon, Microsoft Press,

โฆIA-32 Intel Architecture Software Developerโ€™s Manual. Volume 1-3, Intel Corporation, 2006

Page 58: [The Art of Unpacking]

58 | ํŽ˜ ์ด ์ง€

๋งํฌ: Windows Internals

โฆReactOS Project

http://www.reactos.org/en/index.html

Source Search: http://www.reactos.org/generated/doxygen/

โฆWine Project

http://www.winehq.org/

Source Search: http://source.winehq.org/source/

โฆThe Undocumented Functions

http://undocumented.ntinternals.net

โฆMSDN

http://msdn2.microsoft.com/en-us/default.aspx

๋งํฌ:Reverse Engineering, Software Protection, Unpacking

โฆOpenRCE

http://www.openrce.org

โฆOpenRCE Anti Reverse Engineering Techniques Database

http://www.openrce.org/reference_library/anti_reversing

โฆRCE Forums

http://www.woodmann.com/forum/index.php

โฆEXETOOLS Forums

http://forum.exetools.com