2012년 8월 28일 화요일

악성코드 분석 - Bundestrojaner [2]





트로이 목마 악성코드를 분석한 과정과 결과를 정리하려고 합니다.





정적 분석은 디버깅 프로그램을 이용해 진행됩니다.




먼저 IDA PRO로 악성코드를 로드해 보면 304개의 함수가 사용되었다는 것을 확인하실 수 있습니다.

따라서 모든 함수를 분석하는 것은 불가능하며, 단지 악성코드가 무엇을 하는가에 초점을 맞춰 분석할 것입니다.



이제 OllyDbg로 악성코드를 로드하면 엔트리 포인트 404EDD에서 코드가 시작됩니다.

F8키를 누르면 다음 명령어로 넘어가게 되고, Call 명령어가 있을 때 F7을 누르면 Call 된 함수 안으로 들어가게 됩니다.



조금만 내려가면 익숙한 윈도우 함수 Kernel32.GetVersion 의 Call을 보실 수 있습니다

악성코드는 가장 먼저 운영체제 시스템 버전 정보를 확인하는것을 확인할 수 있습니다.



그리고 나선 Kernel32.GetCommandLine 함수의 Call을 보실 수 있습니다.

참고로 GetCommandLine 함수는 현재 프로세스의 명령행 인수를 조사해 리턴합니다.




하지만 GetCommandLine 함수 이전에 5개의 Call을 보실 수 있을겁니다.

함수의 구체적인 이름은 나오지 않고 함수의 주소만 나와 있는데,

4061C1, 40500A, 405EAC, 그리고 다시 40500A, 마지막으로 408BC6 의 함수를 Call 합니다.

또한 이 함수들 안에는 또다른 함수들이 있으며, 그 함수들중 알려진 API가 나오기 전에 많은 함수 Call이 있을 수 있습니다.

아까도 말씀 드렸듯이 이 프로그램에는 304개의 함수가 사용되었으며, 모든 함수를 분석하는 것은 매우 힘든 작업입니다.

그래서 여기서는 4061C1, 40500A와 같은 함수 Call 이 나왔을 때 IDA를 이용해 IDA가 분석한 함수 이름을 파악하고

sub_ADDRESS 와 달리 의미 있는 함수 이름을 알려주면, 함수가 어떤 역할을 하는구나 정도만

확인하고 넘어가는 방법을 사용하겠습니다.




IDA를 통해 확인해 보시면 첫번째 함수 4061C1를 제외한 다른 함수들은 IDA가 적절한 이름을 제공해 줍니다.





그래서 4061C1만 F7 키를 통해 분석해 보면 heap 메모리를 할당하는 것을 확인하실 수 있습니다.

heap 메모리를 할당하는 함수는 다른 대부분의 실행파일에서도 확인하실수 있는 함수이며

이 악성코드에서는 별다른 작용을 하지 않습니다.

함수의 분석이 끝나면, IDA에서 4061C1 함수의 이름을 heap_alloc 같은 이름으로 바꿔서 분석한 함수의 역할을 기록해 둡니다.

IDA에서 분석한 나머지 함수들의 이름은 다음과 같습니다.

40500A fast_error_exit
405EAC mtinit
408BC6 ioinit

이런 분석 방법은 분석을 지체되지 않게 하며, 결론을 빠르게 낼 수 있도록 도와줍니다.





다시 GetCommandLineA 함수로 돌아와서 분석을 계속합니다.




다음에 나온 함수는 GetStartupInfoA (404F8E) 와 GetModuleHandle (404FB1) 입니다.

이 함수들을 통해 프로그램의 진짜 시작위치에 근접했다는 것을 아실 수 있습니다.




하지만 그 다음 두개의 함수를 Call하고나서 프로그램이 종료되는것을 확인하실 수있습니다.



IDA에서 403D50와 4080AE의 함수 이름을 확인해 보시면 각각 WinMain과



 __exit 함수라는 것을 확인하실 수 있습니다.

이렇게 IDA를 통해 함수의 이름을 확인하실 수 있기에 저는 IDA를 자주 이용합니다.

꼭 IDA 사용법을 공부하셔서 더 많은 것을 얻으시길 바랍니다.

따라서 403D50이 이 프로그램의 진짜 시작이며 모든 프로그램의 시작인 WinMain 함수를

Call한다는 것을 확인하실 수 있습니다.

이젠 403D50에서 F7을 눌러 Step Into 합니다.

Step Into를 하고 나면 바로 403A20 함수를 Call 하는 것을 확인 하실수 있습니다.

403A20 함수에서 악성코드는 System32 디렉토리에 Write 할 수 있는지를 확인하고 가능하지 않다면 프로세스를 종료합니다.




Wirete 여부의 확인은 CreateFileA 함수의 리턴값을 통해 확인합니다.

여기서 리턴값은 00000030 이므로 파일이 만들어진 것을 확인하고 프로세스를 종료하지 않습니다.




이후 Write 여부 확인을 위해 만든 파일( C:\WINDOWS\system32\~pgp~.tmp )을 지우는 것을 확인하실 수 있습니다.

따라서 동적 분석에서 확인했던 C:\WINDOWS\system32\~pgp~.tmp 파일을 만든 이유를 여기서 확인하실 수 있습니다.


악성코드 분석 - Bundestrojaner [3] :

http://carpedm20.blogspot.kr/2012/08/bundestrojaner-3.html


참고 : http://resources.infosecinstitute.com/german-trojan/


댓글 없음:

댓글 쓰기