[the art of unpacking]
TRANSCRIPT
![Page 1: [The Art of Unpacking]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/1.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/2.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/3.jpg)
3 | ํ ์ด ์ง
1. ์๋ก
๋ฆฌ๋ฒ์ค์์ง๋์ด๋ง์์ ํจ์ปค๋ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ฒ ํผ์ฆ ํ๊ธฐ์ค ํ๋์ ๋๋ค. ์ด ํผ์ฆ์ ํธ๋ ๊ณผ์ ์ ๋ฆฌ๋ฒ์๋ค์ OS ์ ๋ณธ์ง๊ณผ
๋ฆฌ๋ฒ์ฑ์ ํธ๋ฆญ, ํด ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ ์ ๋ํด ๋ ๋ง์ ์ง์์ ์ป์ต๋๋ค.
ํจ์ปค(์ด๋ฌธ์ ์์๋ ํ๋กํ ํฐ์ ์คํ์์ถ ๋๋ค๋ฅผ ์๋ฏธ)๋ ํ์ท์ ๋ถ์ํ๋ ๊ฒ์ ๋ณดํธํด์ค๋๋ค.
ํจ์ปค๋ ํฉ๋ฒ์ ์ผ๋ก ์์ฉํ๋ก๊ทธ๋จ์ ํฌ๋ ํ๊ฑฐ๋ ํจ๋ถ๋ก ๋ณ๊ฒฝํ๋ ํ์๋ฅผ ์๋ฐฉํฉ๋๋ค.
๋ถํํ๊ฒ๋ ์ ์ฑ์ฝ๋ ๋ํ ํจ์ปค๋ฅผ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ ์์ ์ถ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
ํจํน๋ ์ ์ฑ์ฝ๋์ ์ซ์๊ฐ ๋์ด๋๋ ๊ด๊ณ๋ก ์ฐ๊ตฌ์๊ณผ ์ ์ฑ์ฝ๋ ๋ถ์์๋ค์ ๋ถ์์ ์ํด์ ์ธํฉ ๊ธฐ์ ์ ๋ฐ์ ์์ผฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์๊ฐ์ด ํ๋ฅด๋ฉด์ ๋ฆฌ๋ฒ์๋ค์ ์ฑ๊ณต์ ์ถ ์ธํฉ์ ๋ฐฉํดํ๊ธฐ ์ํด์ ์๋ก์ฒ ์ํฐ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ ์ ๋์์์ด ํจ์ปค์ ์ถ๊ฐ
๋์ด์ก์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งค๋ฒ ์๋ก์ฒ ์ํฐ ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ ์ด ๊ฐ๋ฐ๋๋ฉด ๋ฆฌ๋ฒ์๋ค์ ๊ทธ ๊ธฐ์ ์ ์ฐํ ํ๋ ๊ธฐ์ ๊ณผ ํด์ ๊ฐ๋ฐํฉ๋๋ค.
์ด ๋ฌธ์์ ์ค์ ์ ํจ์ปค์ ์ง๋ณด๋ ์ํฐ ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ ๊ณผ ํด์ ์ด๋ป๊ฒ ์ฐํํ๊ฑฐ๋ ๋ฌด๋ ฅํ๊ฒ ๋ง๋๋์ง์ ๋ํด ๋ณด์ฌ์ค๋๋ค. ๋ฐ๋๋ก
์ด๋ค ํจ์ปค๋ค์ ์ฝ๊ฒ ์ฐํํ๊ฑฐ๋ ๋ฌด๋ ฅํ๊ฒ ๋ง๋ค ์ ์๋๋ฐ ๊ทธ๋์ ๊ทธ ์ํฐ ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฌ๋ ๋ณดํธ๋ ์ฝ๋๋ ๋ฐ๋์ ํธ๋ ์ด์ฑ ํ๊ณ ๋ถ์ํ์ฌ์ผ ํฉ๋๋ค. ๊ทธ ์๋ก:
โข๋ณดํธ๋ ์ฝ๋์ ๋ถ๋ถ์ด ์ฐํ๋ ๋ชฉ์ ์ผ๋ก ๋คํ ๋์ด ์ํฌํธ ํ ์ด๋ธ ๋ฆฌ๋น๋ฉ ํด๋ก ํ๋ฅญํ๊ฒ ์ธํฉ์ด ๋ฉ๋๋ค.
โข๋ณดํธ๋ ์ฝ๋๋ ๋ฐฑ์ ์ง์ ์ธํจํน์ ๋ชฉ์ ์ ์ํด์ ์ฒ ์ ํ ๋ถ์๋ฉ๋๋ค.
๋ถ๊ฐ์ ์ผ๋ก, ์๋ ค์ง ์ํฐ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ ์ด ์ ์ฑ์ฝ๋์ ์ง์ ์์ฉ ๋ ์์ ๋ ์ ์ฑ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์ถ์ ํ๊ธฐ ์ํด ๋ฆฌ๋ฒ์ฑ์
๋ฅ์ํ ๊ฒ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์๋ ๋ชจ๋ ์ํฐ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ ์ ๋์ดํ์ง ์์๊ณ ์๋ ค์ง ํจ์ปค ๋ค์ ์ท๋ฐ์ ์ผ๋ก ์ต์ํ๊ณ ํฅ๋ฏธ๋ก์ฒ ๊ธฐ์ ์ ๋ํด
๋์์์ต๋๋ค. ์ํฐ๋ฆฌ๋ฒ์ฑ๊ณผ ๋ฆฌ๋ฒ์ฑ์ ๋ํด ๋ ๊ณต๋ถํ๊ณ ์ถ์ ๋ ์๋ ๋ง์ง๋ง์ฅ์ ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋๋ค.
ํ์๋ ๋ ์๋ค์ด ์ด ๋ฌธ์ ์์ ์ ์ฉํ ํ๊ณผ ํธ๋ฆญ์ ๊ธฐ์ ๋ค์ ๋ํด ์๊ฒ ๋์์ผ๋ฉด ํฉ๋๋ค.
ํดํผ ์ธํจํน !
![Page 4: [The Art of Unpacking]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/4.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/5.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/6.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/7.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/8.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/9.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/10.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/11.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/12.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/13.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/14.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/15.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/16.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/17.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/18.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/19.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/20.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/21.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/22.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/23.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/24.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/25.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/26.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/27.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/28.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/29.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/30.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/31.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/32.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/33.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/34.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/35.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/36.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/37.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/38.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/39.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/40.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/41.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/42.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/43.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/44.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/45.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/46.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/47.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/48.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/49.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/50.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/51.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/52.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/53.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/54.jpg)
54 | ํ ์ด ์ง
์ด๋ค ํจ์ปค๋ ๋ ๋จผ ๊ณณ์ ์ ์ฒด DLL ์ด๋ฏธ์ง๋ฅผ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ถ๋ฌ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋ค์ด๋ ํธ๋ API ํจ์๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์์์
DLL ์ด๋ฏธ์ง๋ฅผ ๋ณต์ฌํฉ๋๋ค. ์ด ๊ธฐ์ ์ ์ค์ API ํจ์์ ๋ธ๋ ์ดํฌํฌ์ถํธ๋ฅผ ๊ฑฐ๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
6.6 Multi-Threaded Packers
๋ฉํฐ์ฐ๋๋๋ ํจ์ปค์์ ๋๋ค๋ฅธ ์ฐ๋๋๋ ๋ณดํธ๋ ํ๋ก๊ทธ๋จ์ ๋ณตํธํ ํ๋๋ฐ ํ์ํ ๋ช๋ช ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค.
๋ฉํฐ์ฐ๋๋๋ ํจ์ปค์ ๋ณต์ก๋๋ ์ฆ๊ฐํ์ฌ ์ฝ๋๊ฐ ๋ณต์กํด์ ธ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ๋ ๋งค์ฐ ์ด๋ ค์์ก์ต๋๋ค.
๋ฉํฐ์ฐ๋๋๋ ํจ์ปค์ ํ๊ฐ์ง ์๋ก๋ PECrypt ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋๋ฒ์งธ ์ฐ๋๋๋ ๋ณตํธํ ํ๋๋ฐ ์ฌ์ฉํ๊ณ ๋ฉ์ถ ์ฐ๋๋๋ ์ด
๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฐ ์ฐ๋๋๋ ์ค์๊ฐ์ผ๋ก ์งํ๋ฉ๋๋ค.
PECrypt ์์ ์ฐ๋๋๋ฅผ ์ฌ์ฉํ ๋ช ๋ น์ด ์ฒ๋ฆฌ:
6.7 Virtual Machines
๊ฐ์ ๋จธ์์ ์ฌ์ฉํ ์ด ๊ฐ๋ ์ ์์ฃผ ๊ฐ๋จํฉ๋๋ค. ๋ฆฌ๋ฒ์๋ ์ต์ข ์ ์ผ๋ก ์ด๋ป๊ฒ ์ฐํ/์ํฐ๋๋ฒ๊น , ์ํฐ๋ฆฌ๋ฒ์ฑ์ ๊ธฐ์ ์ ํด๊ฒฐํ
๊ฒ์ถ๊ฐ๋ฅผ ์๊ฐํฉ๋๋ค. ๋ณดํธ๋ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์์์ ๋ณตํธํ ๋ฐ ์คํ๋ ๋ ์ ์ ๋ถ์์ ํ๋ฉด ์ทจ์ฝํฉ๋๋ค.
![Page 55: [The Art of Unpacking]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/55.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/56.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/57.jpg)
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]](https://reader031.vdocuments.site/reader031/viewer/2022021713/620b888c50f2bf1114735381/html5/thumbnails/58.jpg)
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