본문 바로가기

정보보안/악성코드분석

악성코드 분석_dropper.exe

06_dropper.exe 파일 분석

 - 분석 환경 : winXP
 - 분석 파일 : dropper.exe
 - 사용 도구 : exeinfope, PEview, Dependency Walker, string1, PeStudio, Procexp, SysAnalyzer, hashcalc, IDA Pro, OllyDbg

 - C:\Documents and Settings\김정우\Local Settings\Temp 경로에 'notepad.exe' 파일이 있으면 삭제한다.


 

우선 악성코드 분석을 할 때, 악성코드는 결국 프로그래밍에서 특정 함수를 사용하여 악의적인 행동을 할 떄 , 그냥 프로그램에서 악성코드로 바뀌게 되는것이다.

특정 함수만 보고도 악성코드의 목적이나 종류를 알 수 있어야 한다.

 

우선, dropper.exe 를 분석하기 전에 드롭퍼 악성코드에 대해 알아보자. 

 

드롭퍼 악성코드는 자신의 내부의 리소스 영역에 압축해서 가지고있던 코드를 이용하여 악의적인 실행파일을 생성하고 이를 실행하여 시스템을 감염시킨다.

 

드롭퍼 악성코드가 자주 사용하는 함수는 FindResource, SizeOfResource, LoadResource, LockResource 이다.

 

아래의 표는 드롭퍼가 자주 사용하는 주요 함수의 기능이다.    

FindResource 리소스를 찾는 함수
SizeOfResource  리소스의 크기를 구하는 함수
LoadResource  리소스를 로드하는 함수 
LockResource LoadResource후 리소스의 메모리에 로드된 실제주소를 얻어오는 함수

 


 

1. 기초 정적 분석



 1) 패킹 유무 및 제작 프로그램을 확인한다. (exeinfope)

  dropper.exe 파일을 exeinfo에 올려 확인하니 따로 패킹되어있지 않아 바로 실습을 진행하면 될 것 같다. 



 2) 실행 파일에 포함된 문자열 정보를 확인한다. (strings.exe)

cmd창 -> cd : dropper.exe 가 존재하는 파일로 이동 후 strings.exe
dropper.exe.txt_01

dropper.exe.txt_01

 

BIN, @%s\notepad.exe ,c:\Documents and Settings\ 등과 같은 문자열들을 볼 수 있다.

여기까지만 기억해두고 아래에서 분석할때 이러한 문자열들이 무슨 의미를 가지는지 확인해보자. 

 

dropper.exe.txt_02

 dropper.exe.txt_02에 나온 함수들을 표로 정리해봤다. 

SetFilePointer   파일 포인터를 원하는 위치로 옮길 때 사용하는 함수
FindResourceW   리소스를 찾는 함수
LoadResource    리소스를 로드하는 함수 
CreateProcessW   프로세스를 생성하는 함수
WriteFile   파일 데이터를 쓰는 함수
SizeofResource    리소스의 크기를 구하는 함수 
CreateFileW  파일 혹은 오브젝트를 생성하거나 열 수 있는 함수
GetTempPathW  Temp에 지정된 디렉토리의 경로를 검색합니다
LockResource  LoadResource후 리소스의 메모리에 로드된 실제주소를 얻어오는 함수 
CloseHandle   핸들값을 반환. 핸들의 프로세서를 종료시켜주는게 아니라 이제 이 프로세서를 참조하지 않겠다는 뜻.
MessageBoxW  메세지 박스 
wsprintfW 문자열을 이어붙이는 함수 

 

*  CreateProcessW  

 

   윈도우즈에서는 프로세스를 만들기 위해 CreateProcess함수를 제공한다. CreateProcess를 호출하는 프로세스를 부모프로세스라고 하고 CreateProcess로 만들어진 프로세스를 자식프로세스라고 한다.

여기서, 부모프로세스는 dropper.exe 파일이고, CreateProcess 로 인해 만들어진 프로세스는 notepad.exe파일 일 것으로 예상된다. 

 

    -    dropper.exe.txt_02 의 함수들을 보면, 앞에서 설명했던 dropper 악성코드의 주요함수들을 찾아볼 수 있다.

또한, CreateFile 를 이용해서 파일을 생성하고, WriteFile을 이용해 만든 파일에 데이터를 쓴 후, Temp 디렉터리에 저장할것으로 예측된다. CreateProcessW 을 이용해 만든 실행파일을 실행하면, 메세지박스가 뜰 것으로 예상된다. 

 

dropper.exe.txt_03

    -    dropper.exe.txt_03

         dll들을 볼 수 있다. 

dropper.exe.txt_04

 

 04 // 레지스트리 등록도 하는지 모르겠다 안하는걸로 알고있는데 왜 스트링스에 나오쥐 ㅠㅠ 이거는 질문하고 다시 쓸 예정 





 3) PE 구조를 확인한다. (PEview)


PEview에 dropper.exe 파일을 올려서 확인해보았다.

패킹되어있지않으므로, 모든 헤더와 바디를 볼 수 있다.

 

- 제작 날짜, IAT 정보(DLL, API)

IMAGE_NT_HEADERS 의 IMAGE_FILE_HEADER에 들어가 Time Date Stamp를 확인해보자. 

 

dropper.exe 의 IAT 목록_01

 

dropper.exe의 IAT 목록_02

아까 strings에서 확인한 dll과 API들을 확인할 수 있다. 

패킹되어 있지 않으므로 모든 정보들이 나와있는것을 볼 수 있다 .



 4) 문자열 및 IAT 정보를 문서화한다. (Dependency Walker)

 

Dependency Walker으로 dropper.exe파일을 열어보자.

아래는 KERNEL32.DLL의 API들이다.

보면, 위에서 strings로 확인했던 드롭퍼가 자주 사용하는 주요 함수들을 볼 수 있다. 

Dependency Walker_ KERNEL32.DLL
Dependency Walker_ USER32.DLL

USER32.DLL 에는 MessageBoxW 와 wsprintfW 를 확인할 수 있다.

Dependency Walker_ MSVCR20.DLL

 

 

 5) 바이러스 토탈 사이트를 이용하여 자동화 분석을 실시한다. (Windows7 크롬 브라우저)

Virus Total_dropper.exe_ 01
Virus Total_dropper.exe_ 02
Virus Total_dropper.exe_ 03

윈도우 7 브라우저를 열어 바이러스토탈 사이트에 들어가 dropper.exe파일을 열어 얻은 정보들이다. 

 

Virus Total_dropper.exe_ 02 를 보면, 각 섹션에 대한 정보들이 나와있고, Virus Total_dropper.exe_ 03을 보면, 아까Dependency Walker으로 확인한 DLL들이 나와있다. 

여기서 중요한것은, 리소스에 .bin 파일이 존재하는것이 확인되었다.

이 bin 파일은 드롭퍼가 생성할 악성코드일것으로 예상할 수 있다. 

 

 

 

 6) 'PeStudio' 도구를 이용하여 파일을 분석를 정리한다. ( PeStudio )

 

PeStudio 로 분석을 할 떈, 빨간색은 위험도가 높은것을 표시해주기때문에 빨간색글씨 위주로 확인해주면 된다.  

 

아까 바이러스토탈에서 확인했던것들을 여기서도 확인할 수 있다. 

 

 

또한, BIN파일을 가지고 있는것을 확인할 수 있다. 

 

 

위험한 함수와 DLL들을 위와 같이 표시해줬다. 



 7) 드롭퍼로 의심되는 API가 있기 때문에 'PEview' 도구를 이용하여 리소스 영역(Section .rsrc)에 PE 파일이 있는지 확인한다. 

 

PEview로 열어본 결과 위에서 리소스영역에 BIN파일이 존재하는것을 확인하였다.

데이터를 확인해보면 PE 파일 시그니처(MZ)가 존재하므로, 이는 실행파일일것이다. 

BIN 0065 0412 숫자들도 눈여겨보자. 


 8) 'Resource Hacker' 도구를 이용하여 리소스 안에 있는 파일을 확인하여 'a.exe' 파일로 추출한다.

 

     Resource Hacker으로 dropper.exe파일을 열어보았더니, BIN 파일이 존재한다.

 

그러나, PEview에서는 BIN파일의 이름이 0065 0412 이였는데, Resource Hacker에는 101: 1042라는 값이 써져있는것을 확인할 수 있다.

101 -> 65
1042 -> 412

이는 계산해보면 표현만 다르게 되어있을뿐 같은 BIN이란것을 확인해볼 수 있다.

그렇다면, 드롭퍼가 생성하고 실행할 파일을 Resource Hacker을 통해 a.exe파일로 추출해보자. 

마우스 우클릭 -> save *.* resource ...






2. 기초 동적 분석



 1) 'SysAnalyzer' 도구를 이용하여 기초 동적 분석을 진행하고, 'procexp' 도구를 이용하여 프로세스 실행 관련 내용을 확인한다.

 

 

SysAnalyzer 과 Procexp를 둘 다 실행시킨 후, SysAnalyzer 를 통해 dropper.exe를 실행시키면, procexp에 dropper.exe가 실행된 후, 그 아래 notepad.exe가 다음과같이 생성된 후 곧이어 메모장이 화면에 뜨는 것을 확인할 수 있다.

Procexp _ dropper.exe     실행시킨 결과

이는 dropper.exe가 notepad.exe를 생성한 후 실행시켰다는것을 의미한다.

 

   <  SysAnalyzer  >

SysAnalyzer_01, dropper.exe 의 PID는 9B4
SysAnalyzer_02, notepad.exe의 ParentPID 는 2484


SysAnalyzer에 dropper.exe를 올리고 나서 뜬 결과창들이다.

 

SysAnalyzer_02 사진을 보면 notepad.exe 파일의 ParentPID 는 2484이고 SysAnalyzer_01 에서 dropper.exe파일의 PID는 9B4인것을 확인할 수 있다. 

계산기를 열어 계산해보면 , 다음과 같이 notepad.exe의 ParentPID = dropper.exe파일의 PID 임을 알 수 있다.

 

이는 두 실행파일의 프로세스관계는 dropper.exe (부모프로세스) , notepad.exe (자식프로세스)임을 나타낸다.  

 

위에서 설명했듯 CreateProcess를 호출하는 프로세스를 부모프로세스라고 하고 CreateProcess로 만들어진 프로세스를 자식프로세스라고 한다.

 

따라서, dropper.exe는 CreateProcess를 호출하는 대상이고, notepad.exe는 CreateProcess호출의 결과로 만들어진 파일이라고 보면 된다.




 2) 'a.exe' 파일과 'Temp' 디렉토리에 'notepad.exe' 파일이 동일한 파일인지 확인한다.

 

dropper.exe파일의 실행 결과 생성된 notepad.exe
직접 추출한 a.exe실행파일

dropper.exe파일의 실행 결과 생성된 notepad.exe 와 직접 추출한 a.exe파일이다.

 

이 두 파일이 같으면, 위에서 확인되었던 dropper.exe파일의 리소스영역의 BIN파일은 드롭퍼가 설치하는 파일이라고 결론을 도출해낼 수 있다.

 

두 파일의 비교를 위해 파일용량과 해시값을 비교하려 한다. 


 1) 파일 용량이 동일한지 확인한다.

a.exe - 66KB

 

notepad.exe - 66KB

두 파일의 용량 모두 66KB인 것으로 확인되었다.


 2) 'hashcalc' 도구를 이용하여 해시값을 확인한다.

두 파일의 해시값또한 동일한것으로 나왔다.

 

따라서, dropper.exe 파일의 리소스영역에 있던 코드는 드롭퍼가 설치할 악성코드라고 결론낼 수 있다.





3. 고급 정적 분석

 - 'IDA Pro' 도구를 이용하여 고급 정적 분석을 진행한다.

<  401A70 WinMain 함수  >

WInMain 함수

sub_401860에 들어가서 어떠한 코드를 실행하는지 분석해보자


<  401860 CoverDrop 함수  >

 

CoverDrop 함수의 첫 분기 전까지의 모습이다.

분홍색 글씨가 호출하는 함수이고, 함수 호출 전 파란색 글씨들은 함수를 불러오기 위한 매개변수들이라고 생각하면 될 것 같다. 함수 호출을 기준으로 블럭을 나누어서 생각하면 편하다. 

 

함수를 기준으로 이 파일이 어떠한 행위를 하는지 간략하게 분석해보자. 

 

 - Temp 디렉토리 찾기  (C:\Documents and Settings\김정우\Local Settings\Temp)

 

      call    ds:GetTempPathW

 

      버퍼의 주소와 입력할 버퍼의 길이를 PUSH하며 DataSegment 에 Temp디렉터리의 경로를 GetTempPathW 를 이용하여 입력했다. 

 

 

 - Temp 디렉토리 경로에 \notepad.exe를 이어쓰기  (C:\Documents and Settings\김정우\Local Settings\Temp\notepad.exe)

 

push    offset aSNotepad_exe ; "%s\\notepad.exe"
lea     edx, [ebp+CommandLine]
push    edx             ; LPWSTR
call    ds:wsprintfW

 

notepad.exe 경로를 wsprintfW 를 이용하여 temp디렉터리 뒤에 이어붙여서 DS에 저장하였다.


push    offset Type     ; "BIN"
push    65h             ; lpName
mov     eax, hModule
push    eax             ; hModule
call    ds:FindResourceW 

파일타입이 .bin 이고, 이름이 65인 리소스를 찾고


mov     [ebp+hResInfo], eax
mov     ecx, [ebp+hResInfo]
push    ecx             ; hResInfo
mov     edx, hModule
push    edx             ; hModule
call    ds:SizeofResource

리소스의 크기를 블러왔다. 


mov     [ebp+nNumberOfBytesToWrite], eax
mov     eax, [ebp+hResInfo]
push    eax             ; hResInfo
mov     ecx, hModule
push    ecx             ; hModule
call    ds:LoadResource 

리소스를 로드한다. 

리소스를 로드 한 이후, ResData가 0이거나, 기록할 바이트의 수가 0이면 401A42로 분기하는것을 볼 수 있다.

401A42에는 어떠한 일을 수행할까 찾아가봤더니 

다음과 같이  hResData 설치 오류 메세지창이 뜨는것을 확인할 수 있다.

따라서, 데이터값이 존재하지 않거나, 입력할 바이트의 수가 0인경우 저러한 메세지를 띄워준다. 

다시 돌아가서,  ResData가 0이 아니거나, 기록할 바이트의 수가 존재한다면, 분기하지 않고 코드는 계속 진행된다. 

 

- Temp 디렉토리에 'notepad.exe' 파일 생성(단, 0KB 파일이다.)

LoadResource 이후수행하는 LockResource함수를 호출 한 후, CreateFile을 이용하여 파일을 생성한다. 

이는 드롭퍼파일이 떨어트릴 notepad.exe파일을 생성하는 과정에 해당된다. 

 

 - 'dropper.exe' 파일 리소스 영역 있는 실행 파일 데이터를 'notepad.exe' 파일에 쓰기 실시(66KB 파일 생성)

 

SetFilePointer 는 왜하는지 모르겠다 ㅎㅎ ㅋㅋ 그치만 지정된 파일의 파일 포인터를 이동한다고 한다.

아직 파일만 생성되고 파일에는 아무것도 쓰여있지 않아 크기가 0인상태이다.

이제 파일에 내용을 써주기 해 WriteFile를 이용하여 파일에 쓰기를 실시한다. (0KB -> 66KB) 

그 후, CloseHandle 함수를 호출하여 핸들값을 반환한다.

사실 writefile 빼고 의미가 다 이해가 가지 않지만 대충 파일의 포인터를 이동하고, 파일데이터를 쓰고난 후 모든일을 끝마쳤으니 프로세서를 참조하지 않겠다는 의미가 아닐까 싶음 ... ㅎㅎ 

 

 - Temp 디렉토리에 'notepad.exe' 파일 실행

 

 마지막으로 cmd를 통해 만들었던 Temp디렉터리의 notepad.exe를 CreateProcessW 를 통해 실행시키는것을 확인할 수 있다. 

 





4. 고급 동적 분석

 - 'OllyDbg'를 이용하여 고급 동적 분석을 진행한다.

401A70 WinMain 함수


401860 CoverDrop 함수

 

아이다와 마찬가지로 동적분석 역시 함수호출을 기준으로 나누어 분석해보겠다. 

 

- Temp 디렉토리 경로 찾기

 

 

LEA 결과 EAX에 Temp 디렉토리 경로가 저장될 주소가 복사되었다.

 

PUSH EAX&nbsp; /Buffer, PUSH 105&nbsp; / Bufsize

 

CALL GetTempPathW 이후 메모리창에 저장된 Temp경로

 

 

- Temp 디렉토리 경로 찾기

 

 

ECX에 저장해둔 Temp 경로 저장해준 주소값 복사

 

PUSH ECX // Temp경로를 스택에 PUSH

 

 

PUSH notepad.exe // notepad.exe 문자열을 스택에 PUSH

 

 

LEA EDX CommandLine

지금 EDX에 저장되어있는 주소에 Temp디렉터리의 경로와 notepad.exe의 경로가 이어진 전체 경로가 저장될것이다. 

이 주소를 PUSH한 후, wsprintf함수를 호출하면 아래와 같이 12FB00에 전체 경로가 저장된것을 확인할 수 있다. 

 



 - 드롭퍼 3단계 API(FindResource -> SizeofResource -> LoadResource) 찾기

그 후, 드롭퍼가 떨어트릴 파일을 찾아서 그 크기를 재고 로드하는 과정을 거친다.

 

사진을 보면, BIN 파일을 찾고 그 크기를 잰 후 로드하는것을 알 수 있다. 

함수 호출 전에 PUSH하는 것들은 함수 호출에 필요한 매개변수들이라고 생각하면 된다.

이 과정까진 아직 파일이 생성되지 않았으므로, Temp디렉터리에 가도 notepad.exe파일이 존재하지 않는다.

 

CreateFilew을 거친 이후에 notepad.exe가 생성될것이다. 

 

F8을 눌러 진행 후 Temp디렉터리를 가보니 다음과 같이 크기가 0KB인 notepad.exe파일이 생성된 것을 볼 수 있다. 

  

- Temp 디렉토리에 생성된 'notepad.exe' 파일 코드 작성(66KB) 찾기

다음과 같이 SetFIlePointer와 WriteFile을 호출한다.

WriteFile이후 파일데이터가 입력되었으므로, notepad.exe의 용량은 66KB로 변할것으로 예상된다. 

WriteFile 진행 후 Temp 디렉터리를 들어가니 다음과 같이 파일의 크기가 변한것을 확인할 수 있다. 

 

 


 - 'notepad.exe' 실행 찾기

드롭퍼는 파일을 생성한 후 실행까지 하는 악성코드이다. 

실행파일을 실행시키기 위해선 CreateProcessw 의 함수가 호출되어야한다.

F8을 눌러 진행하니 다음과 같이 메모장이 실행되는것을 볼 수 있다. 

이것으로 dropper.exe 파일 동적분석을 마치겠다. 

'정보보안 > 악성코드분석' 카테고리의 다른 글

악성코드 분석 _ downloader.exe  (0) 2022.09.04
악성코드 선수지식  (0) 2022.09.04