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에서는 어떻게 해석할까?
위와같이 이상하게 번역되는 것을 알 수있다.
'reversing > rootkit' 카테고리의 다른 글
장치 노드[Device node], 장치 개체[Device Object] 개념 (0) | 2016.08.07 |
---|---|
Driver 개념 (0) | 2016.08.02 |
Debug Principle[디버거 구조와 원리] : 디버그 이벤트 (0) | 2016.08.01 |
요구 페이지 처리[Demanding Page] (0) | 2016.07.29 |
함수 프롤로그 (0) | 2016.03.29 |