1. 분석 환경
1.1. 분석 환경
l Windows 10 l Windows XP (VMware) |
1.2. 분석 도구
정적 분석 | l IDA |
1.3. 분석 샘플
Practical Malware Analysis Labs - Lab07-02.exe |
1.4. 질문
이 랩에서는 Lab07-02.exe 파일에서 발견된 악성 코드를 분석합니다
1. 이 프로그램은 어떻게 지속될 수 있나요?
2. 이 프로그램의 목적은 무엇인가요?
3. 이 프로그램은 언제 실행이 완료될 것인가요?
2. 분석 과정
2.1. IDA 분석
Lab07-02는 비교적 간단한 구조였으며 호출되는 서브루틴도 없었다.
http://www.malwareanalysisbook.com/ad.html URL로 보아 이곳으로 접속할 것으로 추측한다.
main에서 처음 호출되는 함수는 OleInitialize이다.
OleInitialize 함수는 Windows 환경에서 COM(Component Object Model)을 사용하는 응용 프로그램에서 주로 호출되는 함수이다.
이 함수는 OLE(객체 링크 및 임베딩) 라이브러리를 초기화하고, COM 런타임 환경을 설정한다.
이를 통해 객체 기반의 소프트웨어 컴포넌트들이 상호 작용할 수 있도록 한다.
이 Lab07-02.exe는 OleInitialize의 호출로 보아 객체가 사용될 것으로 추측한다.
아래로 내려보니 CoCreateInstance로 객체를 생성하는 것이 보인다.
dwClscontext = 4인데 4가 의미하는 바는 아래와 같다.
코드를 내려보니, url 문자열은 보이는데, 이전 Lab에서 보았던 InternetOpenUrlA같은 네트워크 관련 함수가 보이지 않았다. 그렇다면 기존과 다른 방법으로 url연결을 했을 것이라 생각했다. 그래서 이 프로그램의 핵심인 인스턴스 생성부를 다시 확인해보았다.
2.1.1. Clsid 와 iid
Rclsid와 riid는 무엇을 의미할까?
l rclsid는 COM 객체를 식별하는 데 사용되는 CLSID를 나타낸다. CLSID는 특정 객체의 클래스를 고유하게 식별하는 GUID이다. 특정 클래스의 구현체를 찾을 때 사용된다. l Riid는 COM 인터페이스를 식별하는 데 사용되는 IID를 나타낸다. IID는 특정 인터페이스를 고유하게 식별하는 GUID이다. 특정 인터페이스에 액세스할 때 사용된다. |
그렇다면 이 식별자 값은 어떻게 보는 걸까?
그래프에서 인자를 더블클릭하면 rdata를 볼 수 있는데, Data값이 그 식별자를 나타낸다. GUID는 32비트 16진수로 구성되며, 8-4-4-4-12 형식으로 표현된다.
그래서 rclsid과 Riid 값은 다음과 같다.
l Rclsid : 0002DF01-0000-0000-C000-000000000046 2DF01에 8자리를 맞추기 위해 앞에 0을붙인다. 0C0의 앞자리 0은 제거된다.그리고 6 DUP(0)은 00쌍 6개를 의미한다. 이는 data4의 c0뒤에 붙는다. l Riid : D30C1661-CDAF-11D0-8A3E-00C04FC9E26E Data4의 0은 00을 의미한다. Data4는 즉 8A, 3E, 00, C0, 4F, C9, E2, 6E 이다. |
이제 이 ID들이 어떤 기능을 가지는 지 확인한다.
clsid는 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID 에,
iid는 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface{IID} 에 위치한다.
검색 시간이 꽤 오래 걸리는 편이다
CLSID는 internet Explorer로 이 악성코드가 실행되어 객체를 생성할 때 실행될 파일이다.
IID는 IWebBrowser2로 COM에서 제공하는 웹브라우징 기능을 위한 인터페이스이다.
결과적으로 이 객체가 인터넷 접속과 관련 있음을 알게 되었다.
이제 앞으로 돌아와 객체 생성부부터 다시 본다.
어셈블리에서 [] 대괄호는 포인터 역할과 비슷하며 괄호 안의 주소가 가리키는 값을 가져온다.
esp+28h+ppv에는 ppv변수의 주소 값이 들어있으며, [esp+28h+ppv]의 의미는 이 주소 값이 가리키는 값. 즉 ppv의 값을 뜻한다.
Lea eax, [esp+24h+ppv] / Push eax : ppv의 값을 eax에 저장해 인자로 전달한다.
CoCreateInstance는 함수실행에 성공하면 ppv에 인터페이스 포인터를 반환한다.
그러므로 ppv는 객체가 생성되면 인터페이스의 포인터가 된다. 실패하면 null을 반환한다.
VariantInit : VARIANT 데이터 형식을 초기화 하는데 사용한다.
SysAllocString : 문자열을 동적으로 할당한다.
위 함수들을 통해 url 문자열을 메모리에 할당한다.
Mov eax, [esp+28h+ppv]
Mov edx, [eax]
Call dword ptr [edx+2ch]
Eax에 인터페이스의 주소가 저장되어 있으므로, mov edx, [eax]에서 edx에 이 인터페이스의 값을 저장한다. 그리고 call dword ptr [edx+2ch]로 인터페이스를 호출한다.
그러므로 call dword ptr [edx+2Ch]는 IWebBrowser2를 호출하게 된다.
2.1.2. Structures 설정하기
dword ptr [edx+2Ch]는 다른 함수와 다르게 안에 들어가 상세한 정보를 볼 수 없었다.
때문에 더 자세히 분석하기 위해 structures 기능을 이용한다.
View – open view – structures
공백에 오른쪽 버튼 – Add struct type
Add standard structure
IwebBrowser2Vtbl 선택 (Vtbl은 가상함수테이블이다.)
다시 IDA View로 돌아와 오른쪽 버튼- Structure offset을 클릭한다.
추가한 IwebBrowser2Vtbl을 클릭하고 OK를 누른다.
인자 값들과 함수 이름이 표시된 것을 확인할 수 있다.
dword ptr [edx+2Ch] 는 Navigate라는 함수이다.
Navigate 는 웹페이지를 탐색할 때 사용되며 지정한 URL로 이동하여 웹페이지를 표시한다.
이 함수는 아래와 같이 선언된다.
3. 문제 풀이
3.1. 이 프로그램은 어떻게 지속될 수 있나요?
지속되지 않는다. 그래프상에서도 루프의 형태를 띄지 않고, 코드상으로도 반복하는 부분이 없다.
3.2. 이 프로그램의 목적은 무엇인가요?
Com 객체를 생성하여 Navigate 메서드를 사용하여 http://www.malwareanalysisbook.com/ad.html 에 접속한다.
3.3. 이 프로그램은 언제 실행이 완료될 것인가요?
인터넷 익스플로러로 http://www.malwareanalysisbook.com/ad.html URL에 접속해 웹페이지를 출력한 뒤 실행이 완료된다.