ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • μ•ˆν‹° 리버싱 :: 05 - μ•ˆν‹° λ””μŠ€μ–΄μ…ˆλΈ”
    SECURITY/REVERSING 2020. 8. 5. 17:00

    μ•ˆν‹° λ””μŠ€μ–΄μ…ˆλΈ”μ€ λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬λ₯Ό 속여 μ‹€μ œ μ‹€ν–‰κ³Ό λ‹€λ₯Έ λͺ…령어듀을 μ΄μš©ν•΄ λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬κ°€ ν˜Όλ™μ„ μΌμœΌν‚€κ²Œ λ§Œλ“ λ‹€.

     

    λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬μ˜ κ°€μ •(assumptions)κ³Ό μ œμ•½(limitations)을 μ΄μš©ν•˜μ—¬, ꡐ묘히 μ‘°μž‘ν•΄μ„œ μœ νš¨ν•œ λͺ…령을 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬μ—κ²Œμ„œ 숨길 수 μžˆλ‹€.

    λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬λŠ” ν•œ λ²ˆμ— λͺ…λ Ήμ–΄ ν•˜λ‚˜λ‘œ λ°”μ΄νŠΈλ₯Ό ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ— 이런 μ˜€ν”„μ…‹μ„ μ΄μš©ν•˜λ©΄ λœλ‹€.

     

     

    즉, 같은 λ°”μ΄νŠΈ μ½”λ“œλ“€μ΄λΌλ„ λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬μ— 따라 λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ‚Ό 수 μžˆλ‹€. 이 점을 μ΄μš©ν•œ 것이 μ•ˆν‹° λ””μŠ€μ–΄μ…ˆλΈ”!

     

    λ”°λΌμ„œ μ–΄λ–€ λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬(IDA, Ollydbg λ“±)λ₯Ό μ΄μš©ν•˜λŠ”μ§€μ— λ”°λΌμ„œ μ˜¬λ°”λ₯΄κ²Œ μΈμ‹ν• μˆ˜λ„, μ•„λ‹μˆ˜λ„ μžˆλ‹€.

     

    " The disassembly examples show two completely different sets of instructions for the same set of bytes. "

     

    λ””μŠ€μ–΄μ…ˆλΈ” 도ꡬ에도 두 μ’…λ₯˜κ°€ μ‘΄μž¬ν•˜λŠ”λ°, 

    μ„ ν˜• λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬(linear disassembler) 와 흐름 쀑심 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬(flow-oriented disassembler) 이닀.

     

    μ„ ν˜• λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬λŠ” 말 κ·Έλž˜λ„ opcode λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ λ²ˆμ—­ν•˜λŠ” 것이닀.

    반면, 흐름 쀑심 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬λŠ” 뢄기문을 κ³ λ €ν•˜λ©΄μ„œ λ²ˆμ—­ν•˜λŠ” 것이닀.

     

    이런 νŠΉμ„±μ„ μ΄μš©ν•΄μ„œ μ•ˆν‹° λ””μŠ€μ–΄μ…ˆλΈ”μ„ ν•  수 μžˆλ‹€.

     

     

    1. xor , jz xxxxxxxx+1;

    : jz/jnz 와 0xe9 (jmp) / 0xe8 (call) 을 적절히 λ°°μΉ˜ν•œλ‹€.

     

     

    ida 와 같은 흐름 쀑심 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬μ—μ„œ 이 기법이 μœ μš©ν•˜κ²Œ 쓰인닀.

    흐름 쀑심 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬λŠ” JNZ/JZ κ°€ 있으면 false branch λ₯Ό λ¨Όμ € μ‚΄νŽ΄λ³Έλ‹€.

     

    JNZ/JZ Conditional -> False Branch -> True Branch

     

     

     

    이 μ½”λ“œλ₯Ό 보면 xor eax, eax λ₯Ό ν•œ ν›„ jz λ₯Ό ν•œλ‹€. 

    xor eax, eax λ₯Ό ν•˜λ©΄ μ–Έμ œλ‚˜ κ²°κ³Όκ°€ 0 μ΄λ―€λ‘œ ZF λŠ” 1 둜 set 되고, λ•Œλ¬Έμ— jz λŠ” 무쑰건 λΆ„κΈ°κ°€ λœλ‹€.

     

    그런데, μ•žμ„œ λ§ν–ˆλ“― 흐름 쀑심 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬λŠ” jz μ—μ„œ false branch λ₯Ό λ¨Όμ € λ³Έλ‹€. 

    λ•Œλ¬Έμ— 00401024 인 8B 둜 λ„˜μ–΄κ°€λ²„λ¦¬λŠ” 것이 μ•„λ‹ˆλΌ false branch 인 E8 둜 λ¨Όμ € 가버린닀.

     

     

    0xe8 은 OPCODE 둜 call μ΄λ―€λ‘œ,, μ›λž˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ§„ν–‰λ˜λ©΄ λ¬΄μ‹œλ˜μ—ˆμ–΄μ•Ό ν•  E8 이 κ°•μ œ ν•΄μ„λ˜μ–΄λ²„λ¦° 것이닀.

    (μ›λž˜λŠ” E8 은 κ·Έλƒ₯,, μ“°λ ˆκΈ°κ°’.

    마치 if(true) {} else ( 3/0; } μ—μ„œ else μ—” μ ˆλŒ€ 갈 일이 μ—†μ§€λ§Œ 0으둜 λ‚˜λˆŒ 수 μ—†λ‹€λŠ” 컴파일 였λ₯˜κ°€ λ‚˜λŠ” 것과 같은 결인 것 κ°™λ‹€.

     

    κ·Έλ ‡κ²Œ CALL λͺ…λ Ήμ–΄κ°€ λ‚˜μ˜€κ³  λ‹€μŒ 값듀을 ν•΄μ„ν•˜κ³ ,, ν•˜λŠλΌ μ € λ’€λΆ€ν„° μ½”λ“œκ°€ λ’€ν‹€λ¦¬λŠ” 것이닀. 

     

    해결법은 μ € E8 을 data 둜 μΈμ‹ν•˜κ²Œ λ°”κΏ”μ£ΌλŠ” 방법이 μžˆλ‹€.

     

    https://medium.com/@preetkamal1012/anti-disassembly-techniques-e012338f2ae0

     

    2. JNZ 와 JZ λ™μ‹œ μ‚¬μš©

     

    https://medium.com/@preetkamal1012/anti-disassembly-techniques-e012338f2ae0

     

    잘 μ‚΄νŽ΄λ³΄λ©΄ jz 와 jnz λŠ” λͺ¨λ‘ 같은 μ£Όμ†Œλ‘œ jmp ν•˜λŠ” λͺ…령어이닀.

     

    ν•˜μ§€λ§Œ λ””μŠ€ μ–΄μ…ˆλΈ”λŸ¬λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ λͺ…λ Ήλ§Œμ„ λ””μŠ€ μ–΄μ…ˆλΈ”(only disassembles one instruction at a time)ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό λˆˆμΉ˜μ±„μ§€ λͺ»ν•˜κ³  jnz 의 false branch 인 EB λ₯Ό μ‚΄νŽ΄λ³Έλ‹€.

     

    EB λŠ” OPCODE 둜 call μ΄λ―€λ‘œ,, λ’€ μ½”λ“œλ“€μ΄ λ’€ν‹€λ¦¬κ²Œ λœλ‹€.

     

    https://medium.com/@preetkamal1012/anti-disassembly-techniques-e012338f2ae0

    그림으둜 보면 이해가 μ‰¬μšΈ 것이닀. 

    ν”„λ‘œμ„ΈμŠ€ μƒμœΌλ‘œλŠ” μ ˆλŒ€ λ„λ‹¬ν•˜μ§€ λͺ»ν•˜λŠ” E8 을 λ””μŠ€μ–΄μ…ˆλΈ”λŸ¬μ˜ νŠΉμ„± 상, λ„λ‹¬ν•˜κ²Œ 된 것이닀.

     

    ν•΄κ²° 방법은 1번과 μœ μ‚¬ν•˜λ‹€.

     

     

     

    μ•ˆν‹° λ””μŠ€μ–΄μ…ˆλΈ”μ€ 이와 같이 ν”„λ‘œμ„ΈμŠ€ μƒμœΌλ‘œ μ§„ν–‰λ˜λŠ” 흐름을 λ”°λ₯΄μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 이λ₯Ό μ΄μš©ν•˜μ—¬ ν˜Όλ™μ„ μ£Όλ©° μ›λž˜μ˜ μ½”λ“œλ₯Ό μˆ¨κΈΈμˆ˜λ„ μžˆλŠ” 것이닀. 

     

     

    μ°Έκ³  λ¬Έν—Œ

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

    [2] https://medium.com/@preetkamal1012/anti-disassembly-techniques-e012338f2ae0

     

    λŒ“κΈ€

Designed by Tistory.