윈도우 환경에서 다른 프로세스에 Code Injection을 위한 기법 중에 주로 사용되는 방법은 WriteProcessMemory와 CreateRemoteThread API를 이용한 방법이 있다. WriteProcessMemory 함수를 이용하여 원격 프로세스의 특정 영역에 필요한 코드 또는 데이터를 Write한 후에 CreateRemoteThread 함수를 이용하여 원격으로 쓰레드를 생성하여 미리 써놓은 코드를 실행하게 된다. 다른 프로세스에 Injection을 위한 방법은 아래 사이트를 참고하기 바란다.

- 참고 사이트 : Three Ways to Inject Your Code into Another Process


SpyEye는 금융관련 개인정보(인터넷 뱅킹 ID, 비밀번호, 인증서 등)를 타겟으로한 악성코드로 수많은 변종이 발생하고 있으며 계속적으로 제작자에 의해 버젼업이 되고 있다. SpyEye 1.3.45 버젼에서 원격 프로세스(explorer.exe)로 Code Injection시 위에서 설명한 방법이 아닌 주목할만한 방법이 있어 정리하려 한다.(물론 이전에도 등장한 방법일 수도 있다.) 주목할 만한 사항은 SpyEye 1.3.45 버젼에서는 CreateRemoteThread를 이용하여 대상 프로세스인 explorer.exe에 원격으로 쓰레드를 생성하지 않는다. 당연히 대상 프로세스에 Write후에 CreateRemoteThread를 호출할 줄 알았지만 확인 결과 CreateRemoteThread는 사용되지 않았다. 그렇다면 어떤 방법을 이용하여 원격 프로세스의 쓰레드를 실행시키는 것일까?

SpyEye 1.3.45 버젼에서는 대상 프로세스인 explorer.exe에 필요한 code write시에는 NtWriteVirtualMemory 함수를 사용한다. NtWriteVirtualMemory의 syntax는 다음과 같다.

NtWriteVirtualMemory(

IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG NumberOfBytesToWrite,
OUT PULONG NumberOfBytesWritten OPTIONAL );


SpyEye 실행 후 첫번째 NtWriteVirtualMemory를 호출하는 부분을 살펴보면 [그림 1]과 같다.

[그림 1] 1st NtWriteVirtualMemory

스택에 저장된 파라미터를 살펴보면 ProcessHandle로 이전에 오픈한 explorer.exe의 핸들이 지정되어 있다. BaseAddress는 explorer.exe에 write할 주소로 0x1EB0000이며, NumberOfBytesToWrite 파라미터 확인시 0x2000 Bytes 만큼 write하는 것을 확인할 수 있다. explorer.exe 프로세스에 write된 내용을 확인해 보면 [그림 2]와 같다.

[그림 2]

   

SysEye에 의해 두번째로 호출되는 NtWriteVirtualMemory 함수를 보면 [그림 3]과 같다.

[그림 3] 2nd NtWriteVirtualMemory

이번에는 explorer.exe 프로세스의 0x1F00000 주소에 0x1000 Bytes 만큼 write하는 것을 확인할 수 있다. 해당 영역을 확인하면 [그림 4]와 같이 데이터가 기록된 것을 볼 수 있다.

[그림 4]

 

세번째 NtWriteVirtualMemory 함수가 호출되는 시점을 확인해보면 [그림 5]와 같이 NtClose 함수의 주소에 5 Bytes 만큼 write하는 것을 확인할 수 있다. write하는 위치와 크기를 봤을때 NtClose 함수를 패치하는 후킹 형태로 추측할 수 있다.

[그림 5] 3rd NtWriteVirtualMemory

실제로 세번째의 NtWriteVirtualMemory가 호출되기 전후의 explorer.exe 프로세스의 NtClose 함수를 확인해보면 다음과 같이 jmp 구문에 의해 패치가 된 것을 확인할 수 있다.

[그림 6] Original NtClose

[그림 7] Patched NtClose

 

NtClose 함수는 CloseHandle의 Native API로 특정 핸들의 close할 때 호출된다. explorer.exe에 의해 핸들 클로징이 발생할 경우 패치된 NtClose로 인해 두번째 write한 0x1F003B2 영역으로 jump하게 된다.

[그림 8]

이 후 위에서 write한 코드가 실행되며 [그림 9]와 같이 쓰레드가 추가로 생성되어 진다.

[그림 9]

이와 같이 SpyEye 1.3.45 버젼에서는 CreateRemoteThread를 호출하여 원격 프로세스에 write한 코드가 실행되는 것이 아니라 NtClose 함수를 후킹하여 미리 write 해놓은 코드를 실행하게된다.


AV 제품으로부터의 진단 회피를 위한 악성코드 제작자들의 노력(?)을 느낄수 있었다. 보안 종사자들이 당연한 것이라 생각할 때 쯤 악성코드 제작자들은 항상 기존의 방법을 변형하거나 뒤집는 새로운 방법을 생각하는듯 하다.

                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : reverseinsight@gmail.com    |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP, SIS1급                             |
                                                                                                    +----------------------------------+

신고
Posted by By. PHR34K

티스토리 툴바