-
μν° λ¦¬λ²μ± :: 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 λ‘ μΈμνκ² λ°κΏμ£Όλ λ°©λ²μ΄ μλ€.
2. JNZ μ JZ λμ μ¬μ©
μ μ΄ν΄λ³΄λ©΄ jz μ jnz λ λͺ¨λ κ°μ μ£Όμλ‘ jmp νλ λͺ λ Ήμ΄μ΄λ€.
νμ§λ§ λμ€ μ΄μ λΈλ¬λ ν λ²μ νλμ λͺ λ Ήλ§μ λμ€ μ΄μ λΈ(only disassembles one instruction at a time)νκΈ° λλ¬Έμ μ΄λ₯Ό λμΉμ±μ§ λͺ»νκ³ jnz μ false branch μΈ EB λ₯Ό μ΄ν΄λ³Έλ€.
EB λ OPCODE λ‘ call μ΄λ―λ‘,, λ€ μ½λλ€μ΄ λ€νλ¦¬κ² λλ€.
κ·Έλ¦ΌμΌλ‘ 보면 μ΄ν΄κ° μ¬μΈ κ²μ΄λ€.
νλ‘μΈμ€ μμΌλ‘λ μ λ λλ¬νμ§ λͺ»νλ E8 μ λμ€μ΄μ λΈλ¬μ νΉμ± μ, λλ¬νκ² λ κ²μ΄λ€.
ν΄κ²° λ°©λ²μ 1λ²κ³Ό μ μ¬νλ€.
μν° λμ€μ΄μ λΈμ μ΄μ κ°μ΄ νλ‘μΈμ€ μμΌλ‘ μ§νλλ νλ¦μ λ°λ₯΄μ§ μκΈ° λλ¬Έμ μ΄λ₯Ό μ΄μ©νμ¬ νΌλμ μ£Όλ©° μλμ μ½λλ₯Ό μ¨κΈΈμλ μλ κ²μ΄λ€.
μ°Έκ³ λ¬Έν
[1] practical malware analysis / Michael Sikorski & Andrew Honig / 2012 / Ch.15
[2] https://medium.com/@preetkamal1012/anti-disassembly-techniques-e012338f2ae0
'SECURITY > REVERSING' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
κ°μ λ¨Έμ - virtualBOX μ€μΉ λ° μ€μ (0) 2020.09.03 μν° λ¦¬λ²μ± :: 06 - μ½λ λλ ν, ν¨νΉ (0) 2020.08.05 μν° λ¦¬λ²μ± :: 04 - μν° λλ²κΉ κΈ°λ²λ€ μκ° (0) 2020.08.05 μν° λ¦¬λ²μ± :: 03 - μν° λλ²κΉ μμ (0) 2020.08.04 μν° λ¦¬λ²μ± :: 02 - μν° λλ²κΉ (0) 2020.08.04