안녕하세요. Message입니다.

<실전 악성코드와 멀웨어 분석> 책의 실습 문제 7-2을 분석합니다.

악성코드의 분량은 얼마 되지 않았지만.. 익숙하지 않은 내용들로 인해 시간이 많이 걸렸습니다.

분석환경은 Windows 7 Ultimate 64x / Vmwre 12.1.0 build 입니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

0. 기초 동적 분석

------------------------------------------------------------------------------------------------------------------------------------------

문제풀이에 앞서 간단한 동적 분석을 진행합니다.

 

1) PE구조 & 패킹체크

별도의 패킹이 되어 있지 않습니다.

 

2) DLL 체크

ole32.dll, OLEAUT32.dll, MSVCTR.dll 총 3개의 DLL을 임포트합니다.

MSVCRT.dll에서 가장 많은 13개의 API를 임포트하고 있습니다.

 

- ole32.dll

3개 API 모두 생소합니다. 책에서는 COM과 관련된 API라고 되어있지만

COM 자체가 다뤄보지 않은 영역이다보니 개념이 잘 잡히지 않더군요.

 Tip. COM

 위키백과 : 컴포넌트 오브젝트 모델(Component Object Model, COM)은 마이크로소프트가 개발한

 소프트웨어 구성 요소들의 응용 프로그램 이진 인터페이스이다.

 COM을 이용해 개발된 프로그램들은 프로세스간 통신과 동적 오브젝트 생성이 가능하다.

 + 여러 컴포넌트 객체를 이용하여 프로그램을 개발하는 모델을 의미

 실습교재 : 이종의 소프트웨어 컴포넌트에서 상호 세부내용을 모르더라도 서로 다른 코드를

 호출할 수 있게 하는 인터페이스 표준이다. COM을 이용하는 악성코드를 분석할 때

 COM 함수 호출의 결과로 어떤 코드가 실행될지 알 필요가 있다.

 

- OLEAUT32.dll

Name에는 Ordinal 값만 적혀있으며, Hint가 N/A로 비어있네요.

DWalker로 살펴보았더니, N/A로 비어져 있는건 똑같지만

Ordinal 값에 해당하는 함수는 아래 스샷과 같이 보기 좋게 표기되어 있었습니다.

해당하는 API는 SysAllocString(0x0002), SysFreeString(0x0006), VariantInit(0x008) 이군요.

SysAllocString : COM에서 다루는 스트링인 BSTR생성 (VC++에서 유니코드 문자열은 BSTR타입으로 표시)

② SysFreeString : 할당한 BSTR 해제

③ VariantInit : COM에서 사용하는 VARIANTARG(or VARIANT) 구조체 초기화

 

- MSVCTR.dll

앞에 [ _ ] 문자가 1~2개씩 붙어있는 API 들이 많습니다.

검색해보니, 아래와 같이 나와있더군요.

"밑줄이 붙는 것은 MS 확장 키워드이며, 밑줄 한개의 경우는 하위 호환성을 위해 남겨져 있을 뿐 2개가 정식 표기"

"C++ 의 표준 키워드에 MS가 약간의 의미변경 or 기능추가한 경우, 맡줄을 추가하여 컴파일러가 판단하는 기준으로 사용"

별거 아닐 수 있지만...모르면 찜찜하니까요.

 

 

3) String 체크

지금까지의 악성코드 실습파일중 역대급으로 출력되는 스트링이 없네요.

.rdata 영역에 dll 이름만 덩그러니 놓여 있습니다.

 

뭔가 허전하기도 해서, 지난번 Tip을 복습할겸 .rdata 영역에 대해서 다시 보았더니...

>> .rdata : 프로그램 내의 전역에서 접근 가능한 읽기 전용 데이터를 담고 있음.

>> .idata : 존재 시 임포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 임포트 함수 정보에 저장

그래서 .idata가 정말 없나? 하고 CFF로 구조를 살펴보니 정말 .idata 섹션이 없네요!

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 이 프로그램은 어떤 방식으로 지속 메커니즘을 보장하는가?

2. 이 프로그램의 목적은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

일단 악성코드를 실행해 보면 특정 URL의 ad.html 페이지가 뜨게됩니다.

웹페이지의 이름으로 미루어보건데, 광고페이지로 추정됩니다.

 

Hex-ray 기능을 이용하여 해당 악성코드의 main을 살펴보면

별도의 지속성을 위한 메커니즘이 보이지 않으며, 굉장히 짧은 코드내용을 가지고 있습니다.

 

어셈블리코드를 보면서 찬찬히 분석을 해봅니다.

COM을 사용하는 각 스레드는 다른 COM 라이브러리 함수 호출 전에 적어도 한번은

OleInitialize나 CoInitializeEx 함수를 호출해야합니다.

현재 분석중인 악성코드 역시 OleInitialize 함수를 호출하고 있으며,

이후에 CoCreateInstance에 RCLSID, RIID, PPV 등의 인자값을 넣어주며 COM 기능에 접근합니다.

RCLSID : 클래스식별자 / 생성하고자 하는 컴포넌트의 CLSID

② RIID : 인터페이스식별자 / 얻고자 하는 컴포넌트의 인터페이스

③ PPV : 객체 인터페이스를 받을 수 있는 포인터

 

악성코드는 COM에 접근하며 넣어주는 클래스식별자(CLSID)는 0002DF01-0000-0000-C000-000000000046 입니다.

CLSID값이 의미하는 것이 무엇인지 알아내려면 레지스트리 HKLM∖SOFTWARE∖Classes∖CLSID 에서 찾아보아야 합니다.

LocalServer32Internet Explorer 경로가 존재하므로,

CoCreateInstance가 호출될때 로드할 실행 파일임을 유추할 수 있습니다.

 

인터페이스식별자(RIID)로 넣어주는 값은 0D30C1661-0CDAF-11D0-8A3E00C04F0C90E26E 입니다.

해당값은 검색해 보았더니 MSDN에서 친절하게 알려주더군요!

 

CoCreateInstance 함수가 성공적으로 동작하게 되면, PPV로 명명한 변수 내의 스택에 저장되며

COM의 기능을 사용하기 위해 인자값으로 사용될 변수(URL 등)들을

VariantInit 함수와 SysAllocString 함수를 이용하여 세팅합니다.

 

COM의 기능을 호출하는 부분은 0x401074 주소입니다.

하지만 지금까지 편리하게 분홍색으로 표시해주는 API들과는 달리

명령어 call dword ptr [edx+2Ch] 로 표기되어 있습니다. 단번에 어떤 기능을 호출하는지 파악하기 어렵습니다.

악성코드 프로그램이 COM 함수를 호출했을 때 무슨 일이 일어나는지 인지하기 위해

IDA Pro의 구조체 서브뷰(SubView)에서 [INSERT - Add standard structure] 기능을 이용합니다.

 Tip. Structure 기능 활용하기

 구조체 표기를 변경하기 위해 퀵뷰에서 Structure를 선택합니다.

  

 

 우리가 필요한 구조체는 CoCreateInstance 함수를 호출할때 인자값으로 넣어주었던

 인터페이스식별자, 즉 IwebBrowser2 이므로, 해당값으로 검색해줍니다.

 검색결과는 IwebBrowser2②IwebBrowser2Vtbl 2개가 나옵니다.

 결과적으로 ①번은 오프셋이 나오지 않았고, ②번을 추가했더니 정상적으로 명명이 됐습니다.

 아마 오프셋을 명명하는데 필요한 부분이 IwebBrowser2 구조체 자체가 아니라

 가상 포인터 테이블 목록(VTBL, Virual Function Table)이 필요해서가 아닐까 추측합니다.

 

 

 이후에는 2Ch에 마우스 우클릭을 하면, 아래와 같이 오프셋을 명명할 수 있습니다.

 

 

 

변경하고나니 아래처럼 스택에 푸시되는 인자값들의 설명도 자동으로 표기됩니다. 

이후에 SysFreeStringOleUninitialize 등을 호출하며 main이 종료됩니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

3. 이 프로그램은 언제 실행을 종료하는가?

------------------------------------------------------------------------------------------------------------------------------------------

결과적으로 COM 기능을 이용하여 광고 웹페이지를 띄운 후 실행을 종료합니다.

 

posted by Red_Message