'IDA remote debugging'에 해당되는 글 1건

  1. 2011.10.05 [Tip and Tech] IDA 원격 디버깅을 이용한 injected code 분석 방법 (2)

악성코드들은 AV의 진단을 회피하거나 정상 프로세스로 위장하여 동작하기 위해 code injection 기법을 많이 사용한다. 대부분 악성코드에 의해 inject되는 대상 프로세스는 explorer.exe, winlogon.exe, svchost.exe등 윈도우 정상 프로세스를 대상으로 한다. inject된 코드를 분석하기 위해 대상 프로세스를 디버거에 attach하면 시스템이 제대로 동작하지 못해 분석에 어려움을 겪게 된다. 이럴 경우 유용한 방법이 IDA의 원격 디버깅 방법을 이용하여 injected code를 분석하는 방법이 있어 정리한다.

IDA가 설치되어 있는 폴더를 보면 원격 디버깅을 위한 서버 역할을 하는 win32_remote.exe, win32_remotex64.exe 파일이 존재한다. 디버깅 대상의 비트 수에 맞는 파일을 가상머신에 복사한다. (물론 가상머신에 IDA가 설치되어 있으면 복사하지 않아도 된다.)

[그림 1]

win32_remote.exe 옵션을 보면 [그림 2]와 같다. 한 시스템에 2개 이상의 서버를 실행하기 위해서는 "-p[port number]" 옵션을 준 뒤 실행하면 된다.

[그림 2]

아무런 옵션없이 실행시 기본 포트인 23946 포트를 사용한다. IDA 버젼에 따라 1개의 포트에 1개의 세션만 지원할 수도 있으며 여러 개의 세션을 지원할 수도 있다.(6.1 버젼에서는 1개의 포트로 여러 개의 세션 지원이 가능했다.)

[그림 3]

원격 디버깅을 위한 서버를 실행했으니 이제 호스트 PC에서 가상 머신에 있는 injector 역활을 하는 샘플을 오픈한다. "Debugger → Run → Remote Windows debugger"를 선택하면 [그림 4]와 같이 대상 파일에 대한 정보와 접속을 위한 IP주소 및 포트 번호를 입력하는 다이얼로그 박스가 생성된다.

예제의 주소는 "C:\TEST\sample.exe"에 위치하며 접속을 위한 위한 정보를 기입한 뒤 "OK"를 클릭한다.

[그림 4]

정상적으로 가상머신에 접속이 되었다면 [그림 5]와 같이 해당 파일의 EP(Entry Point)에서 정지된 상태로 해당 파일이 오픈되는 것을 확인할 수 있다.

[그림 5]

파일을 오픈했으므로 이제 해당 샘플의 인젝션 대상이 되는 프로세스를 attach한다. "Debugger → Attach → Remote Windows Debugger"를 선택한 뒤 가상머신에 대한 접속를 입력 후 "OK"를 클릭하면 원격 시스템의 프로세스 목록이 출력된다. 예제의 경우 explorer.exe가 injection되는 대상이므로 explorer.exe를 선택하였다.

[그림 6]

sample.exe에서 code injection을 위해서는 WriteProcessMemory API를 이용하여 대상 프로세스의 특정 영역에 데이터를 write한 뒤 CreateRemoteThread API를 통해 대상 프로세스에 write한 코드를 실행한다. 따라서 CreateRemoteThread API에 BP(Break Point)를 설정한 뒤에 특정 프로세스(explorer.exe)에 원격으로 쓰레드를 생성하는지 살펴본다.

[그림 7]

CreateRemoteThread의 syntax는 다음과 같다

 HANDLE WINAPI CreateRemoteThread(
    __in HANDLE hProcess,
    __in LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in SIZE_T dwStackSize,
    __in LPTHREAD_START_ROUTINE lpStartAddress,
    __in LPVOID lpParameter,
    __in DWORD dwCreationFlags,
    __out LPDWORD lpThreadId
);

CreateRemoteThread의 첫번째 파라미터인 hProcess에 0xFFFFFFFF 값이 올 경우 CreateThread 등을 호출하여 자신의 프로세스 내부에서 쓰레드를 생성하는 과정이므로 무시한다. explorer.exe 프로세스에 인젝션 하는 부분을 보면 [그림 8]과 같이 hProcess가 0x6C, lpStartAddress는 0x17D0000인것을 확인할 수 있다.

[그림 8]

원격으로 쓰레드를 생성하여 실행하고자 하는 위치의 주소(0x17D0000)를 확인했으므로 explorer.exe를 attach한 IDA에서 0x17D0000 BP(Break Point)를 걸어준다. 이 후 CreateRemoteThread를 실행하면 explorer.exe의 0x17D0000 위치에서 실행이 멈추는 것을 확인할 수 있으며 이제 injected code를 분석하면 된다.

[그림 9]

예제 샘플에서 injected code는 LoadLibrary를 실행하여 미리 생성한 dll 파일을 explorer.exe에 로드하는 역할을 수행한다.

[그림 10]

○ Reference

- MalwareReversing : https://malwarereversing.wordpress.com/2011/09/27/debugging-injected-code-with-ida-pro/

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

신고
Posted by By. PHR34K

티스토리 툴바