2014년 3월 26일 수요일

RemoteDLL을 이용한 실행 압축된 DLL 파일 분석

악성코드를 분석 하다보면 다양한 형태의 파일들을 마주치게 됩니다. 그 중에는 PE 파일 형태인 EXE, DLL와 SYS에서부터 스크립트(Script) 그리고 마이크로소프트(Microsoft) 오피스(Office)와 어도비 리더(Adobe Reader) 문서 파일까지 다양한 파일 형태들을 마주치게 됩니다.

분석 당시에 접하게 되는 다양한 파일 형태의 악성코드들을 살펴보면, 그 시대 상황에 맞는 악성코드 형태가 어떠한 것들인지 비교적 쉽게 알 수가 있습니다.

과거 제가 처음으로 악성코드 분석 업무를 시작하던 시기에는 악성코드 감염을 위한 테스트 시스템이 윈도우 98(Windows 98)을 사용했던 시기였으며, 악성코드들 역시 대부분이 EXE, COM과 PIF 파일 형태 였기 때문입니다.

하지만 시간이 지나면서 다양한 파일 형태의 악성코드들이 발견되기 시작하였고, 악성코드 제작자들 역시 악성코드 자기 보호를 위한 목적으로, 보안 업체의 분석 시간을 지연시키고 안티 바이러스 소프트웨어(Anti-Virus Software)의 탐지를 우회하기 위해 실행 압축(Packer)와 프로텍터(Protector)를 사용하기 시작하였습니다.

이러한 실행 압축 및 프로텍터 프로그램들은 악성코드 분석가 입장에서는 비교적 피곤하게 만드는 여러가지 요소들 중 하나입니다.

악성코드 분석가 입장에서는 분석을 맡게 된 파일들을 비교적 빠르게 악성코드 인지 아니면 정상 파일인지 판단하고, 진단을 위한 적절한 진단 기법을 선정하는 작업들을 진행해야 됩니다. 하지만, 실행 압축과 프로텍터로 제작된 파일들에 대한 분석을 맡게 되면 실행 압축을 모두 풀려면 시간 소요가 크기 때문에 분석 진행 속도가 늦어지게 되는 것을 고려하지 않을 수가 없습니다. 특히나, 분석을 맡게 된 파일이 특정 이슈가 존재하는 파일이라면 분석가 입장에서는 시간적인 압박을 받을 수 밖에 없습니다.

실행 압축과 프로텍터로 보호된 파일이라도 EXE 처럼 실행 가능한 파일이라면 동적 분석(Dynamic Analysis)를 통해 악의적인 기능이나 증상이 나타나면 그나마 비교적 쉽게 분석을 할 수 있지만, DLL 파일이 실행 압축이나 프로텍터로 보호된 파일이라면 고민이 되기 시작합니다.

그래서, 오늘 이야기 할 부분이 바로 실행 압축된 DLL(Dynamic Link Libraries) 파일에 대해 비교적 쉽고 빠르게 분석 할 수 있는 방법  입니다. PE 파일의 실행 압축 여부를 판단하는 기법들은 몇 가지가 있지만, 이는 다음 기회에 다루기로 하고 오늘은 실행 압축된 DLL 파일에 대한 이야기만 하려고 합니다. :)

개인적으로 좋아하는 악성코드 분석 관련 서적 중 하나인 "실전 악성코드와 멀웨어 분석 Practical Malware Analysis" 에서는 Rundll32.exe를 이용해 DLL 파일을 동적 분석 할 것을 알려주고 있습니다.

개인적인 경험으로 대부분의 DLL 파일을 동적 분석 할 때 Rundll32.exe가 요긴하지만, 일부 DLL 파일에 대해서는 해당 방법으로 분석이 가능한 것은 아닙니다. 그리고, DLL 파일을 분석 할 때 마다 커맨드라인(CommandLine) 명령을 입력하는 것은 여간 귀찮은 것이 아닙니다.

그래서, 실행 압축된 DLL 파일을 분석 할 때는 SecurityXploded에서 배포하는 "RemoteDLL"을 사용해, 분석 대상되는 DLL 파일을 특정 프로세스에 강제로 인젝션(Injection) 시킨 후 해당 DLL 파일에 대한 메모리 덤프(Memory Dump)를 생성하여 스트링(String)을 살펴본다면 비교적 빠르게 악의적인 기능 여부를 확인 할 수 있습니다.

우선 RemoteDLL의 외형을 살펴보면 기본적인 GUI는 아래 이미지와 같이 직관적으로 쉽게 사용 할 수 있게 되어 있습니다.

상단의 붉은 색 박스를 살펴보면, RemoteDLL의 기능은 2가지로, 특정 DLL 파일을 강제로 인젝션시키거나 이와 반대로 인젝션 되어 있거나 스레드(Thread)로 로딩되어 있는 DLL 파일을 풀기 위해 사용 할 수 있습니다.


그리고 아래 이미지의 붉은 색 박스와 같이 그 하단에는 선택한 DLL 파일을 어떠한 방식으로 인젝션 할 것인지 사용자가 선택 할 수 있습니다.


VMWare에 존재하는 윈도우 XP 32Bit 운영체제의 RemoteDLL은 선택 할 수 있는 인젝션 기법이 "CreateRemoteThread"와 "QueueUseAPC" 2개만이 존재 합니다. 하지만 64Bit 운영체제에서는 위 2개의 기법 외에도 "NtCreateThreadEx"를 추가로 선택 할 수 있습니다.

그리고, 그 하단에 윈치하는 윈도우 아이콘은 현재 RemoteDLL이 실행 중인 시스템에서 실행 중인 프로세스(Process) 리스트들이 나열 됩니다. 이는 현재 실행 중인 프로세스들 중 인젝션 대상이 되는 프로세스를 사용자가 임의로 선택 할 수 있습니다.


아래 이미지에 존재하는 붉은 색 박스에는 인젝션을 시킬 DLL 파일을 선택 할 수 가 있습니다. 다만 인젝션 시킬 DLL 파일의 확장자가 반드시 .dll로 정의되어 있어야 하며, 그렇지 않을 경우에는 인젝션 기능이 정상적으로 동작하지 않습니다.


인젝션 대상이 될 프로세스와 인젝션 시킬 DLL 파일이 모두 선택 되었다면, 하단에 존재하는 "Inject DLL" 버튼을 클릭하기만 하면 됩니다.

그렇다면 실제 실행 압축된 DLL 파일을 이용해 특정 프로세스에 인젝션 한 후 인젝션 된 DLL 파일의 메모리 덤프를 생성하여, 문자열 정보를 확인하는 과정을 살펴 보도록 하겠습니다.

테스트를 위해 "실전 악성코드와 멀웨어 분석 Practical Malware Analysis" 1장에서 제공하는 예제 DLL 파일을 UPX로 실행 압축하였습니다.


그리고, RemoteDLL을 실행 시킨 후 인젝션 대상이 될 프로세스를 위해 더미(Dummy) 프로그램으로 PEiD를 실행 합니다. 당연히 개인적인 취향에 따라 다른 프로그램을 실행 시켜도 무방합니다. 그리고 인젝션 된 DLL 파일의 메모리 덤프를 생성하기 위해 PETools를 실행 합니다. 이 역시 스레드 메모리 덤프를 생성 할 수 있는 다른 툴을 사용하여도 무방합니다.

이제 준비가 되었다면, 아래 이미지와 같이 "CreateRemoteThread" 를 선택 한 후에 앞서 설명한 바와 같이 인젝션 대상이 되는 프로세스인 PEiD를 선택 합니다. 인젝션 기법 중 "CreateRemoteThread" 을 선택한 이유는 개인적인 경험 상 가장 무난하게 인젝션이 성공하기 때문입니다.

인젝션 기법까지 모두 선택하였다면, 이제는 인젝션 시킬 DLL 파일을 선택 합니다.


모두 준비가 되었다면, 이제는 하단에 존재하는 "Inject DLL"을 클릭하여 인젝션 작업을 진행 합니다. 인젝션이 성공하게 되면, 아래 이미지와 같이 인젝션이 성공하였다는 로그가 남게 됩니다.


인젝션이 성공하게 되면 최초 실행하였던 PETools에서 아래 이미지와 같이 인젝션 대상이 되었던 PEiD 프로세스를 클릭 한 후 하단의 스레드 리스트 중 인젝션 시킬 DLL 파일을 선택 합니다. 그리고 오른쪽 마우스를 클릭하여 "Dump Full"을 클릭하여 적절한 위치에 메모리 덤프 파일을 생성 합니다.


그 이후에는 파일 내부의 스트링을 확인 할 수 있는 "BinText"와 같은 툴을 이용하여 DLL 파일 내부의 스트링을 확인 할 수 있습니다. 다만, 메모리 덤프를 통해 생성한 DLL 파일임으로 IAT(Import Address Table)이 손상되었음을 참고 할 필요는 있습니다.


이렇게 RemoteDLL을 이용해 실행 압축이나 프로텍트로 보호 된 DLL 파일에 대해 비교적 쉽고 빠르게 내부에 존재하는 스트링 확인을 통해, 악의적인 기능이 존재하는지 살펴볼 수 있습니다.

댓글 없음:

댓글 쓰기