안녕하세요. Message입니다.

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

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

 

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

0. 기초 동적 분석

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

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

 

1) PE구조 & 패킹체크

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

 

2) DLL 체크

샘플 [Lab06-01.exe]와 동일하게 KERNEL32.dll, WININET.dll 2개의 dll을 임포트합니다.

다만 WININET.dll의 임포트 함수 목록이 5개로 증가하였습니다.

InternetOpenA, InternetOpenUrlA 등 샘플 [Lab01-02.exe] 에서 분석하였던 API가 보입니다.

아마 문자열을 어떤 IE를 사용하는지, 어떤 URL로 접속하는지 나오지 않을까요?

 

3) String 체크

IDA의 String Window(Shift+F12)를 보면 아래와 같이 .data에서

IE버전과 URL을 발견할 수 있습니다.

 

 

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

1. main 함수가 호출하는 첫 번째 서브루틴은 무슨 오퍼레이션을 수행하는가?

2. 0x40117F에 위치한 서브루틴은 무엇인가?

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

호출되는 첫번째 서브루틴은 샘플 [Lab06-01.exe]와 동일합니다.

[ View-Graphs-FlowChart(F12) ] 를 이용하여 전체적인 맥락을 살펴보면

전 샘플과는 다르게 if문이 중첩되어 있는 사실을 알 수 있습니다.

어쨋든 첫번째 서브루틴은 동일 기능입니다.

 

0x40117F에 위치한 서브루틴은 샘플 [Lab06-01.exe]와 동일하게 printf 기능을 수행합니다.

 

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

3. main 함수가 호출하는 두 번째 서브루틴은 무엇인가?

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

main 함수가 호출하는 두번째 서브루틴(loc아님)은  아래와 같은 구조를 가지고 있습니다.

전체적인 파악을 하려면 시간이 좀 걸리겠습니다.

 

그래프는 복잡하지만 IDA의 Hex-ray 기능을 이용하면 좀더 직관적인 파악이 가능합니다.

소스코드를 통해 유추한 내용을 바탕으로 대략적인 흐름은 아래와 같습니다.

① InternetOpenA : WinNet 라이브러리 사용 초기화

② InternetOpenUrlA : FTP or HTTP URL이 명시하는 위치로 핸들 얻기

③ InternetReadFile : InternetOpenUrlA를 통해 얻은 핸들을 이용하여 데이터를 읽음

④ InternetCLoseHandle : 오픈한 핸들 닫기

 

해당 프로그램이 어떤 결과를 도출하는지 알아내기 위해 OllyDbg를 통해 살펴봅니다.

본래 InternetOpenUrlA API를 호출하여 연결에 성공하면 EAX 레지스터에

URL에 대한 올바른 핸들값이 리턴되지만, 성공하지 못하면 NULL 값이 리턴됩니다. 

 

이후 "Error 2.1: Fail to OpenUrl" 문자열을 출력하고 InternetCloseHandle API를 이용하여 핸들을 닫습니다.

 

하지만, 해당 프로그램이 연결에 성공했다면 어떻게 되었을까요?

InternetReadFile API를 이용하여 데이터를 읽었을겁니다.

이후에 if문을 통해 buffer의 값을 비교하기 시작합니다.

 

buffer의 값을 1씩 올리면서 비교하는 구문은 OllyDbg를 통해 보면 아래와 같습니다.

같지 않을 경우 무조건 0x0040111D로 분기하는 것이 else 구문을 표현하는 것이었군요.

 

물론 IDA의 Graph 모드를 통하면 좀더 직관적으로 알 수 있습니다.

하지만 이부분도 Hex-ray 기능이 없었다면 파악하기 힘들었을 것 같네요.

이러한 패턴을 잘 눈여겨 봐야겠습니다.

  

비교하는 문자열 3Ch와 21h 등을 IDA에서 우클릭을 통해 변환하면

위와 같이 "<!--" 형태의 HTML 주석 문자열임을 알 수 있습니다.

문자열 비교가 성공적(?) 으로 끝나면 5번째 문자열을 AL(1byte 0f EAX) 레지스터에 옮깁니다.

즉 리턴값인거죠.

 

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

4. 이 서브루틴에서 사용한 코드 구조는 어떤 유형인가?

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

3번 과정에서 AL에 리턴값을 성공적으로 가져왔다면 어떤 구조로 실행되는지 다시 Main으로 가봅니다.

AL레지스터의 값을 비교하는데 TEST EAX, EAX 명령어를 사용했습니다.

지난번에 Tip에 해당 명령어에 대해 기재했었지만 다시 까먹은 관계로 복습하면

"함수에서 돌아온 이후 수행하는 TEST EAX, EAX 명령어는 두 OP가 모두 0인지 판단" 합니다.

즉 AL에 0이 리턴됐다면 실패한 것이고, 성공했다면 AL에 5번째 문자 1Byte가 할당되어 있겠죠?

 

이후 printf 함수로 "Success: Parsed command is %c\n" 문자열을 출력하고

Sleep 함수를 실행합니다.

여기서 %c 문자는 레지스터 AL에 담긴 1byte 문자입니다.

 

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

5. 이 프로그램에서 네트워크 기반의 행위가 존재하는가?

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

① User-Agent 값으로 IE 7.5 를 사용

http://mal...(중략).../cc.htm 을 다운로드

 

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

6. 이 악성코드의 목적은 무엇인가?

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

인터넷 연결의 활성 여부를 확인한 이후

특정 User-Agent 를 이용하여 웹페이지 다운을 시도합니다.

해당 웹페이지는 주석으로 시작하며, 파싱에 성공하면 출력 후 종료합니다.

 

 

posted by Red_Message