그럼 저번에 말했던 대로 이번엔 실행된 다음에 생긴 ZoneLockUp.exe파일을 분석해보겠습니다.
프로세스 익스플로러에서 ZoneLockup.exe파일의 속성을 보면 system32폴더에 파일이 존재한다고 합니다.
그러므로 이제 system32폴더에 들어가서 이 프로그램을 올리디버거를 통해 분석해보겠습니다.
그런데 Webcam.scr파일이 upx패킹이 되있는 상태로 복사가 됬으므로 ZoneLockup.exe파일도 upx패킹이 되있겠군요. 실제로 확인해보니까 upx패킹이 되있는 파일의 첫부분이랑 같네요. 그러면 upx를 통해 언팩을 한 다음 분석을 해보겠습니다.
저번부분이랑 같은 부분을 모두 제외하고 다른 부분부터 분석을 시작하겠습니다.
004026A5 push zonelock.00404010 //C:WINDOWS\SYSTEM32\
004026AA push zonelock.00404540 //C:WINDOWS\SYSTEM32\ZONELOCKUP.exe
004026AF call <jmp.&CRTDLL.strstr>
004026B4 add esp,8
004026B7 cmp eax,0
004026BA jnz short zonelock.00402736
이부분에서 strstr함수를 이용해서 zonelcok.00404540의 문자열에서 zonelock.00404010문자열이 어디서 시작하는지 비교를 한다고 썼었는데요 이 비교를 통해서 둘다 system32폴더에 있다는것을 알게되고, system32폴더에 있다는 소리는 이미 한번이상 실행됬었다는 소리이므로 파일을 복사하는 구간말고 이제 다른 동작을 하는구간으로 jmp하게 됩니다.
이부분이 이제 jnz short zonelock.00402736을 통해 온 곳입니다.
00402736 call <jmp.&KERNEL32.GetCommandLineA>
0040273B push zonelock.00405538
00402740 push eax
00402741 call <jmp.&CRTDLL.strstr>
00402775 push zonelock.004050A3
0040277A push 1
0040277C push 0
00402788 call <jmp.&KERNEL32.CreateMutexA>
00402792 jnz short zonelock.0040279B
00402796 call <jmp.&KERNEL32.ExitProcess>
00402736주소에서 GetCommnadLineA를 통해서 이 파일의 커맨드라인을 불러오는데요, strstr을 이용해서 이 파일의 커맨드라인중 qwer플러그가 있는지 보고 없으면 잘못된 설치라보고 DeleteFileA함수를 이용, 파일을 삭제하고 있으면 그 밑인 00402788주소의 CreateMutexA함수를 사용합니다.
CreateMutex함수를 이용해서 특정한 이름의 Mutex를 만드는데요 그 Mutex의 이름은 00402775주소에서 push한 botsmfdutpex란 이름입니다.
이 Mutex를 생성한 이유는 이 프로그램이 2개 이상이 한꺼번에 켜지는것을 막기 위해서입니다.
Mutex를 생성시킬때 이미 생성이 되있나 보고 이미 생성이 되있으면 00402792주소의 jmp구문을 통해서 00402796주소에서 ExitProcess를 통해 프로그램이 꺼지게 됩니다.
004027A7 call <jmp.&KERNEL32.GetModuleFileNameA>
004027B6 call <jmp.&KERNEL32.GetSystemDirectoryA>
004027C7 call <jmp.&WS2_32.WSAStartup>
004027CE je short zonelock.004027D7
004027D7 call <jmp.&KERNEL32.ExitProcess>
004027E8 call <jmp.&KERNEL32.GetVersionExA>
먼저 004027A7과 004027B6에서 차례대로 파일실행경로,system파일경로를 호출합니다만 어디서 쓰는지는 모르겠습니다.
그 다음에는 WSAStart함수를 호출합니다.
MSDN의 설명에 따르면 WSAStart란 함수는 Winsock DLL을 사용한다는 일종의 선언문이라고 합니다.
여기서 sock이라는것은 네트워크부분을 할때 많이 듣는데요 정확히는 뭔지 모르겠지만 이것으로 이 바이러스는 네트워크를 이용할것이라는것을 알 수 있습니다.
그리고서는 이 MSDN그림의 밑에 있는 Return value에서의 Error code가 반환됬는지 확인하고 에러가 뜨면 004027D7주소의 ExitProcess를 통해 종료하고 에러가 안뜨면 004027E8주소의 GetVersionExA함수를 통해 사용자 컴퓨터의 버전을 뽑아냅니다.
004027F5~004028E9 :사용자 OS의 정보가 뭔지 비교
00402901 call <jmp.&CRTDLL.sprintf>
0040291F call <jmp.&ADVAPI32.GetUserNameA>
이부분은 이제 사용자의 정보를 빼가는 곳인데요 먼저 004027F5주소부터 004028E9주소까지는 GetVersionExA함수로 인해 얻은 정보가 뭔지 비교하는 구간이고, 이 얻은 정보를 메모리에다 저장하는것이 00402901주소에 있는 sprintf함수입니다. 그 다음에는 0040291F주소의 GetUserNameA함수를 이용해서 사용자의 이름을 빼냅니다.
00402939 push 0
0040293F call <jmp.&WININET.InternetGetConnected>
00402946 jnz short zonelock.00402954
0040294D call <jmp.&KERNEL32.Sleep>
00402952 jmp short zonelock.0040299A
00402954 cmp dword ptr ds :[edi*4+405104],0
0040295C jnz short zonelock.00402960
0040296E call zonelock.004029B1
0040297B jnz short zonelock.0040298A
0040298D je short zonelock.0040299C
00402995 call <jmp.&KERNEL32.Sleep>
0040299A jmp short zonelock.00402939
0040299C call <jmp.&WS2_32.WSACleanup>
004029A3 call <jmp.&KERNEL32.ExitProcess>
일단 사진에서 가장 왼쪽의 화살표로 보실수 있듯이 00402939부터 0040299A까지가 루프이며 루프를 빠져나온 직후인 0040299C에서는 WSACleanup,그 다음인 004029A3에서는 ExitProcess를 호출하는것으로 보아 여기서 모든 일을 처리하며 이 일이 끝난뒤에는 WSACleanup으로 인터넷으로부터 연결할 준비를 끊고, 프로그램을 끕니다.
그럼 이제 루프를 분석해보겠습니다.
루프에 여러 jmp구문들이 있지만 호출되는 API함수는 0040293F하나이므로 간단합니다.
0040293F부분에서 InternetGetConnected함수를 호출하는데 이 함수는 이 컴퓨터가 인터넷이랑 연결이 가능한지를 확인하는 함수입니다.
만약 인터넷 연결이 안되면 0040294D주소의 Sleep함수를 통해서 30초를 대기한다음에 0040299A주소로 jmp하는데 0040299A주소가 00402939주소로 jmp하기 때문에 30초후에 다시 인터넷연결을 체크한다고 보실수 있습니다.
인터넷 연결이 되면 0040296E주소로 가서 zonelock.004029B1주소의 함수를 call하게 됩니다.
그럼 이번에는 004029B1주소의 함수가 어떤 일을 하는지 알아보겠습니다.
004029C3주소의 call부분을 보시면 0040129C주소의 함수를 호출한다고 합니다.
위의 두 사진이 0040129C함수의 모습인데요 쓰기가 슬슬 귀찮아지고 스크롤이 점점 짧아지는걸 느끼니 간단하게 함수들의 사용만 보겠습니다.
004012AD socket
004012C6 memset
004012D9 htons
004012E7 inet_addr
004012F7 gethostbyname
0040132C connect
이 함수들을 보니 socket을 이용해서 인터넷에 연결한다는 뜻이 되겠네요.
그 다음 다시 004029B1으로 돌아와서 보면
00402A33주소의 sprintf값을 보면 메모리에 집어넣으려는 값 형식이 "%d,%d,%d,%d"인것으로 미루어보아 이부분은 이제 연결할 서버의 ip값을 찾는다고 보시면 됩니다.
그래서 한번 봤더니 0,0,0,0이 되네요. 이 부분은 확실하지는 않지만
1. 맨 처음 이 바이러스가 백신에 검출된 이후로 이 서버를 닫아버렸다.
2. 이 부분이 ip값이 아니다.
둘중에 하나일것같네요.
앞부분 생략
00402AB0 call zonelock.004014EC
00402AD9 call <jmp.&CRTDLL.sprintf>
이부분에서는 이렇게 두 부분이 중요할것같은데요 sprintf로 전달되는 최종 값이 NICK vsorpy USER vsorpy "x.com" "x" :x인데 vsorpy같은 경우는 이제 인터넷 통신을 하기 위한 규약이라고 합니다. 그리고 x는 이제 실행할때 마다 값이 달라지는데요 이부분의 값을 만들어주는 부분이 바로 00402AB0주소가 가리키는 함수입니다.
004014F8 call <jmp.&CRTDLL.srand>
004014FE call <jmp.&CRTDLL.rand>
0040151E call <jmp.&CRTDLL.rand>
이 세부분을 통해서 이 함수는 랜덤하게 숫자를 생성시켜서 아까 위의 sprintf로 전달되는 값을 만듭니다.
이 부분을 넣은 이유는 바이러스가 널리 퍼졌을때 서버에 같은 이름이 없게 해서 충돌되지 않아 여러 사용자들에게 한꺼번에 정보를 빼낼수 있게 하기 위함이라고 생각합니다.
이렇게 인터넷연결을 마치고, ip주소,서버주소, 사용자의 개인정보, 서버에 쓸 이름 등을 모두 준비한다음에 00402B01주소의 send명령을 통해서 서버에 이 바이러스가 이 사용자에게 완벽하게 퍼졌고, 다른 동작을 할 준비가 됬다라고 공격자에게 보냅니다.
이렇게 해서 공격자는 바이러스를 이용해서 여러여러짓을 하는데요 이것은 이제 또 다음 글에서 다루겠습니다.
'악성 코드 분석' 카테고리의 다른 글
JS:DownloadNSave-Z [Adw] 분석 (0) | 2014.01.19 |
---|---|
악성코드 Backdoor.Hacarmy.D 분석-3 (0) | 2013.06.19 |
악성코드 Backdoor.Hacarmy.D 분석-1 (1) | 2013.06.06 |