Profile

youngsouk

youngsouk

안티 디스어셈블리

디스 어셈블리 기법에는 2가지가 있다.

1. 선형 디스어셈블리

예외 없이 코드 블록을 반복하면서 디스어셈블한다. 그래서 switch 포인터를 담고 있는 배열 등 등 데이터도 명령어로 해석해버린다.

 

 

2. 흐름 중심 디스어셈블리

jmp, call과 같은 논리적 흐름에 따라 디스어셈블한다. jz 이런 조건 분기의 경우 거짓 또는 참을 가정하여 디스어셈블한다. 이런 요소를 이용해 안티 디스어셈블리 기법을 개발할 수 있다.

 

안티 디스어셈블리

1. jz, jnz를 이용하여 동일한 위치로 점프하는 명령어를 구상 & 0xe9(jmp) or 0xe8(call) 들을 적적히 배치한다.

조건 분기에서 거짓을 가정하고 디스어셈블하게 되면 call 또는 jmp를 먼저 디스어셈블하게 된다. 

 

 

2. 2개 이상의 명령어가 한 메모리 공간을 공유하도록 한다. 즉 바이트를 동시에 사용하도록 한다.

mov ax, 0xe905; (0xe9 : jmp)

의미 없는 코드들...

 

xor eax, eax

그 뒤에 jz명령어로 0xe9쪽으로 점프를 하면 두개의 명령어가 동시에 한 바이트를 명령어의 일부로서 가지는 것을 알 수 있다.

 

3. call, ret 명령어 이용

call 명령어는 돌아갈 주소를 스택 최상단에 저장하는 명령어인데 이것을 이용해 간단히 디스어셈블러를 무력화할 수 있다.

 

0 : call 1

1 : add [esp], 4 ( 원하는 대로 설정)

2. ret ( 이사이에 dummy 코드가 들어가도 상관 없다.)

5:정상 명령어들

 

4. SEH 체인 이용

SEH 헨들러에 함수를 추가해놓고, 에러를 의도적으로 일으키는 방법, 정상적인 흐름으로 다시 되돌리기 위해서는

mov esp, [esp + 8]

mov eax, fs:[0]

mov eax, [eax]

mov eax, [eax]

mov fs:[0], eax

add esp, 8

 

이런 명령을 실행해야 한다. 저기서 mov eax, [eax] 가 2번 있는 이유는 에러처리 헨들러가 실행될 때 운영체제에서 또 다른 SEH 헨들러를 추가하기 때문이다.

 

5. 스택 프레임 조작

조건 분기처럼 보이는 무조건 분기를 통해, 절대 분기가 안되는 지점에

add esp, 0x1000

과 같이 스택을 음수로 만드는 코드를 놓고, 분기가 되는 지점에 정상적인 코드를 놓으면 된다. 여기서 조건분기를 거짓으로 가정하고 디스어셈블하는 경우가 많기 때문에 거짓 쪽에 이 기법을 사용하는 것이 좋다.

'악성코드 분석' 카테고리의 다른 글

안티 가상머신  (0) 2020.03.07
안티 디버깅 기법  (0) 2020.03.06
네트워크 시그니쳐 생성  (0) 2020.03.01
유용한 DNS 검색 사이트  (0) 2020.02.29
악성코드 실행 방법  (0) 2020.02.28