본문 바로가기

reversing/rootkit

Anti Disassembly[안티 디스어셈블]

SMALL

Assemble이란?

어셈블리 언어를 기계어로 변환하는 것을 말한다.


Disassemble이란?

기계어를 어셈블리 언어로 변환하는 것을 말한다.


우리가 평소에 사용하는 디버거들도 디스어셈블 tool이라고 할 수있다.

기계어를 어셈블리 언어로 보여주니깐!


디스어셈블 tool에도 두 가지 종류가 있다.

1. 선형 디스어셈블러 [leaner sweep]

2. 흐름 중심 디스어셈블러 [recurisvie traversal]

이 두가지이다.


차이점을 알아 보도록한다.


선형 디스어셈블러는 정직하게 하나하나 해석 하는 형식이다.

분기문과 같은것을 신경쓰지 않고 그대로 op code만 

번역하는 것이다.


흐름 중심 디스어셈블러는 분기문을 확인하면서 해석 하는 형식이다.

좀 더 자세하게 설명하면 디스어셈블러가 번역을 하다가.

jmp문을 만나면 이러한 것을 고려해서 해당 위치를 고려하면서

번역 하는것이다.


Anti Disassembly

 

        프로그램 내에서 특수한 코드와 데이터를 사용해 디스어셈블리         

        도구가 잘못된 프로그램 코드로 번역유도

        분석가의 분석을 지연 및 방해

         특정 자동 분석기법을 차단


자료를 찾다보면 선형 안티 디스어셈블리를 속이는 방법은 많이 나오는데

흐름 중심 디스 어셈블리를 속이는 방법은 많이 안나오는 것 같다.


흐름[분기문] 을 고려해서 번역하기 때문인것 같다.


하지만 이러한 흐름을 속이는 방법 중에 스택을 이용해서 흐름을 제어하면

번역하지 못하는것을 알 수 있다.


밑에 부분은 예제 코드이다.

fake 부분은 실행되지 않는 부분이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        mov ebx, Real_1 
        push ebx 
        xor ebx,ebx
        jnz Fake_1
        retn 
Fake_1: 
        _emit 0xe8   OP Code
Real_1: 
        mov eax, dword ptr fs:[0x18
        mov ebx, Real_2 
        push ebx
        xor ebx,ebx
        jnz Fake_2  
        retn 
Fake_2:
        _emit 0x74  OP Code
Real_2: 
        mov eax, dword ptr [eax+0x30
        movzx eax, byte ptr ds:[eax+0x2
        test eax,eax
        jz Function_no_debug
 
 
cs


위와 같은 구분을 ida에서는 어떻게 해석할까?



위와같이 이상하게 번역되는 것을 알 수있다.

LIST