SECURITY/REVERSING

μ•ˆν‹° 리버싱 :: 06 - μ½”λ“œ λ‚œλ…ν™”, νŒ¨ν‚Ή

\b\t 2020. 8. 5. 18:11

 

1. μ½”λ“œ λ‚œλ…ν™” (Code Obfuscating)

 

 " obfuscate "

 

 

말 κ·ΈλŒ€λ‘œ μ½”λ“œλ₯Ό 읽기 μ–΄λ ΅κ²Œ λ§Œλ“€μ–΄μ„œ λ¦¬λ²„μ„œλ“€μ΄ λΆ„μ„ν•˜κΈ° μ–΄λ ΅κ²Œ ν•˜λŠ” κΈ°μˆ μ΄λ‹€.

 

λ‚œλ…ν™” λŒ€μƒμ— 따라 크게

- μ†ŒμŠ€μ½”λ“œ λ‚œλ…ν™” : ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μž‘μ„±λœ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ•Œμ•„λ³΄κΈ° νž˜λ“  ν˜•νƒœλ‘œ λ°”κΎΈλŠ” 기술

- λ°”μ΄λ„ˆλ¦¬ λ‚œλ…ν™” : 컴파일 후에 μƒμ„±λœ λ°”μ΄λ„ˆλ¦¬λ₯Ό 역곡학을 톡해 λΆ„μ„ν•˜κΈ° νž˜λ“€κ²Œ λ³€μ‘°ν•˜λŠ” 기술

둜 λ‚˜λˆŒ 수 μžˆλ‹€.

 

λ‚œλ…ν™”λ₯Ό μ‹œν‚€λ©΄ 결과값이 λ™μΌν•˜κ³  문법에 μœ„λ°°λ˜μ§€λŠ” μ•Šμ§€λ§Œ λ³€μˆ˜λͺ…, μˆœμ„œ, μ“Έλͺ¨μ—†λŠ” μ½”λ“œ 등을 μ΄μš©ν•˜μ—¬ μ½λŠ” 것을 μ–΄λ ΅κ²Œ λ§Œλ“œλŠ” 것이닀.

 

(μ•”ν˜Έν™”μ™€λŠ” μ’€ λ‹€λ₯Έ κ°œλ…μ΄λ‹€.

μ•”ν˜Έν™”λŠ” 읽기 μ–΄λ €μš΄ μˆ˜μ€€μ΄ μ•„λ‹ˆλΌ ν‚€κ°’(DES, AES λ“±) 이 μžˆμ–΄μ•Ό λ³Ό 수 μžˆλ‹€λŠ” 뜻..!)

 

 

 

1.1 Dummy Codes

 

: μ‹€μ œλ‘œλŠ” μ•„λ¬΄λŸ° 역할을 ν•˜μ§€ μ•Šμ§€λ§Œ, μ½”λ“œ 사이에 λ„£μŒμœΌλ‘œμ¨ μ½”λ“œ λ‚œλ…ν™”λ₯Ό μ‹œν‚€κ±°λ‚˜ λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬μ™€ 같은 λΆ„μ„νˆ΄μ΄ λͺ…λ Ήμ–΄(instruction)듀을 잘λͺ» ν•΄μ„ν•˜κ²Œ ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€.

 

κ°„λ‹¨ν•œ Dummy Codes 듀을 μ„žμ€ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

(흐름 νŒŒμ•…μ„ μœ„ν•΄... )

 

__asm {
    xor ebx, ebx
    add ebx, 2
    add esi, ebx
    mov eax, fs:[0x30] // PEB
    mov ecx, 0xsecurityfact
    cmp ecx, 0xsecurity
    jne fact
    add esp, 0x20
    call esp  // never happen
    fact:
    	sub ecx, eax
        cmp byte ptr [eax + 2], 1 // BeingDebugged vs 1
        je DebuggerDetected
        lea ebx, [eax + ecx]
        push 00403116
        push 0
        call printf
        xor ecx, ecx
    DebuggerDetected:
        add ecx, 3
    	push 004030F1
        push 0
        call printf
        xor ecx, ecx
}
       
        

 

이 μ€‘μ—μ„œ μœ νš¨ν•œ, λͺ©ν‘œν•˜λŠ” μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

__asm {
    mov eax, fs:[0x30] // PEB
    jmp fact
    fact:
        cmp byte ptr [eax + 2], 1 // BeingDebugged vs 1
        je DebuggerDetected
        push 00403116
        push 0
        call printf
    DebuggerDetected:
        push 004030F1
        push 0
        call printf
}

 

 

2. νŒ¨ν‚Ή(Packing)

 

νŒ¨ν‚Ήμ€ 크게

- ν”„λ‘œκ·Έλž¨ μš©λŸ‰μ„ μ€„μ΄κ±°λ‚˜(shrink),

- 검사/뢄석을 μ–΄λ ΅κ²Œ ν•˜κΈ° μœ„ν•œ

2가지 λͺ©μ μ„ μœ„ν•΄ μ‚¬μš©λœλ‹€.

 

λ§Žμ€ packer κ°€ μžˆμ§€λ§Œ, λͺ¨λ‘ λΉ„μŠ·ν•œ νŒ¨ν„΄μ„ 가진닀:

- μ‹€ν–‰ νŒŒμΌμ„ λ³€ν™˜ν•˜μ—¬ λ°μ΄ν„°λ‘œ μ €μž₯ν•˜κ³ ,

- OS μ—μ„œ ν˜ΈμΆœν•˜λŠ” μ–ΈνŒ¨ν‚Ή μŠ€ν…(unpacking stub) 을 μ œκ³΅ν•œλ‹€.

 

κ·Έλž˜μ„œ μ••μΆ• νŒŒμΌκ³ΌλŠ” 달리, 내뢀에 μ••μΆ• ν•΄μ œ μ½”λ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” μˆœκ°„μ— μ•Œμ•„μ„œ 압좕이 ν•΄μ œλ˜κ³  μ‹€ν–‰λ˜λŠ” κΈ°μˆ μ΄λ‹€.

 

 

이λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것이 패컀(packer)이고, μƒμš©ν™”μ€‘μΈ νŒ¨μ»€λ“€μ˜ μ’…λ₯˜μ™€ νŠΉμ§•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² λ‹€.

 

 

2.1 UPX

 

- 프리웨어 https://github.com/upx/upx

- κ°€λ²Όμš°λ©΄μ„œ λ‹€μ–‘ν•œ 포맷 지원

- 효율이 μ’‹μ•„ 많이 μ“°μž„

 

 

2.2 ASPack / ASProtect

 

- μƒμš© ν”„λ‘œκ·Έλž¨

- x86, x64 μœˆλ„μš° μ‹€ν–‰νŒŒμΌμ„ λͺ¨λ‘ 지원

- μ½”λ“œ μ••μΆ•λ₯ μ€ κ·Έλ‹₯μ΄μ§€λ§Œ μ•”ν˜Έν™”λŠ” 잘 λ˜μ–΄μžˆλ‹€. (Stolen Bytes 기법이 졜초둜 κ΅¬ν˜„λœ 패컀)

 

http://www.aspack.com/

 

2.3 Themida

 

- κ°€μž₯ κ°•λ ₯ν•œ 패컀 쀑 ν•˜λ‚˜ (μ–ΈνŒ¨ν‚Ήν•  수 μžˆλŠ” μžκ°€ 많이 μ—†λ‹€κ³ ..)

- anti-debugging, anti-dumping, anti-VM λ“± λ‹€μ–‘ν•œ κΈ°λŠ₯ 지원 및 직접 μ»€μŠ€ν…€ κ°€λŠ₯

- ν˜„μž¬ μΉ΄μΉ΄μ˜€ν†‘, 은행 λ“±μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ 많이 μ‚¬μš© 쀑

(μ‹€μ œλ‘œ 디버거 μ“°λ©΄μ„œ μΉ΄μΉ΄μ˜€ν†‘ μ‚¬μš© λΆˆκ°€λŠ₯.. μ΄λ•Œ λœ¨λŠ” 경고문에 Themida ~ μ˜ˆμ „ κ²Œμ‹œκΈ€ μ°Έκ³ )

2020/08/04 - [SECURITY/REVERSING] - μ•ˆν‹° 리버싱 :: 01 - μ•ˆν‹° λ¦¬λ²„μ‹±μ΄λž€?

 

 

https://www.oreans.com/

 

μ°Έκ³  λ¬Έν—Œ

[1] practical malware analysis / Michael Sikorski & Andrew Honig / 2012 / Ch.18

[2] Anti-Reversing Techniques / κΉ€ν˜•μ°¬ / 20160929