Practical Malware Analysis 3-4
실습 3-4
실습 환경 : Vmware (Windows 7 32 bit)
사용한 툴 : IDA Free, PEiD, String
[01] 이 파일을 실행했을 때 어떤 일이 발생했는가?
우선 PEiD를 사용하여 패킹 여부를 검사하니 패킹은 되어있지 않았다. 그리고 String을 사용하여 문자열을 찾아보니 아래와 같았다.
문자열을 살펴보니 URL형식의 문자열도 보이고 명령어 형식의 문자와 인자 같은 문자열들이 보였다. 이제 파일을 실행해 보니 조금 뒤 파일이 사라졌다. 아마 특정한 뭔가가 없으면 실행 시 자신을 삭제하는 파일인 것 같다.
[02] 동적 분석 시 장애물이 무엇인가?
이 파일은 위에서 처럼 뭔가 조건 없이 실행했을 경우 삭제가 되기 때문에 동적 분석을 하고 싶어도 할 수 없었다.
[03] 이 파일을 실행시키는 다른 방법이 있는가?
일단 파일을 IDA Free로 열어서 임포트 함수를 살펴보면 ADVAPI32.dll에서 서비스를 조작하는 함수와 레지스트리를 조작하는 함수들을 확인할 수 있었고 WS2_32.dll에서 네트워크 기능을 하는 것을 확인할 수 있었다. 이제 IDA를 통해 프로그램을 분석해보면
파일의 main을 살펴보면 파일 인자 값을 1과 비교해 인자 값이 하나가 아니면 loc_402B1D로 점프한다. 아무런 입력도 없이 파일을 실행했으므로 402B03으로 가서 분석을 해보면 아래와 같다.
여기서는 call sub_401000을 확인할 수 있는데 이 함수를 분석해보자
이 구간은 RegOpenKeyExA함수를 사용하여 SOFTWARE\microsoft \ XPS 레지스터 오픈을 시도하는데 XPS란 레지스터가 없으므로 0이 아닌 값을 반환하고 아래처럼 eax값을 0으로 초기화시킨 뒤 sub_401000에서 빠져나온다.
0을 반환하고 빠져나오기 때문에 위의 jz를 통해 loc_402B13으로 점프한다.
여기서 call sub_402410을 확인할 수 있는데 분석을 진행해보면
GetModuleFileNameA함수를 사용해 실행 파일의 경로를 가져오고 GetShortPathNameA함수를 사용하여 경로를 단축화 하여 가져온다. 밑으로 내려서 더 살펴보면
cmd를 shellExecuteA함수를 사용하여 열어서 /c del + 실행파일 경로 + » NUL인 명령어를 실행하여 자신을 삭제하는 것을 알 수 있었다. 인자 값이 하나일 경우를 살펴봤으므로 이제 main으로 돌아가 인자 값이 하나가 아닐 경우 점프하는 loc_402B1D를 살펴보자
loc_402B1D를 살펴보면 eax에 arg_0을 ecx에 arg_4를 넣는데 arg_0은 위에서 분석했듯이 인자 값이므로 argc라는 것을 알 수 있고 arg_4는 argv값이라고 추측할 수 있다. 그리고 [ecx+eax*4-4] 주소의 값을 edx에 넣는데 이 값은 마지막 파라미터 값으로 추측할 수 있다. 이 값을 var_4 이동시키고 다시 eax로 이동시켜 call sub_402510 함수의 파라미터로 푸시하는 것을 볼 수 있으니 sub_402510 함수를 분석해보자.
살펴보면 edi에 입력받은 마지막 파라미터 값을 집어넣고 ecx를 FFFFFFFF로 만든다. 그리고 eax를 0으로 초기화 한 뒤에 repne scasb를 사용하여 Zero Flag가 0일 때 ecx만큼 eax와 edi를 한 byte씩 비교하고 ecx를 not연산을 통해 구하면 ecx에 마지막 파라미터의 문자열 길이가 남는다. 여기에 add ecx, -1(0 FFFFFFFFh)을 한 값이 4가 되면 loc_40252D로 점프하는 것을 볼 수 있는데 만약 4자리가 아니라면 함수는 바로 종료된다. 그럼 이제 loc_40252D를 분석해보자
eax에 마지막 파라미터 값을 집어넣고 eax의 한 바이트 값을 cl에 넣은 뒤 cl을 var_4에 저장하고 그 값을 다시 edx에 저장한 뒤 a(61h)와 비교하는 것을 볼 수 있다. 이걸 토대로 생각해보면 파일 실행 시 마지막 파라미터 4자리 중 앞자리가 a라는 것을 알 수 있다. 이제 loc_402542를 분석해보자
eax에 다시 마지막 파라미터 4자리를 넣고 [eax+1]을 통하여 cl에 마지막 파라미터 두 번째 문자를 넣는다. 그리고 cl의 값을 var_4로 이동시킨다. 그 뒤 edx에 마지막 파라미터 4자리를 넣고 al에 var_4의 값(두 번째 문자)를 넣는다. 그러고 나서 al과 [edx] 값 한 byte(마지막 파라미터 첫 번째 문자)를 빼고 그 값을 var_4로 다시 넣는다. 이제 다시 ecx에 var_4를 이동시키고 ecx와 1을 비교하여 점프하는데 앞에서 확인했듯이 마지막 파라미터의 첫 번째 문자는 a(61h)이므로 두 번째 파라미터는 b(62h)란 것을 알 수 있다. 이제 loc_402563을 분석해보자
처음엔 var_4의 값을 al로 이동시키고 dl에 63h(c)를 넣는다. 그 뒤에 imul dl을 사용해 al과 dl을 곱한 값을 al에 저장한다. 그다음 al값 한 byte를 다시 var_4로 이동시키고 var_4를 eax에 넣는다. 그리고 마지막 파라미터 4자리를 ecx에 저장한 뒤 [ecx+2] 즉 마지막 파라미터의 3번째 문자를 edx로 이동시키고 eax와 비교하는데 eax값은 63h(c)이기 때문에 마지막 파라미터의 3번째 문자는 c(63h) 임을 알 수 있다. 이제 loc_402580을 분석해보자
분석을 진행해보니 al에 전에 var_4에 저장되어있던 63h값을 저장하고 1을 더하는 것을 확인할 수 있다. 그리고 그 값을 var_4를 거쳐 ecx에 저장하고 [edx+3] 즉 마지막 파라미터의 마지막 4번째 문자를 eax에 저장한 뒤 비교하는 것을 확인할 수 있으므로 마지막 파라미터의 마지막 문자는 d(64h) 임을 알 수 있다. 그리고 이 모든 문자들이 일치하면 loc_40259B로 점프한다.
여기선 eax값을 1로 만들고 함수를 종료하는 것을 확인할 수 있다. 이제 마지막 파라미터 값이 abcd인 것을 알았으므로 다시 돌아가서 분석해보자
다시 loc_402B1D로 돌아와 보면 test eax, eax를 사용하여 eax값을 검사해 eax가 0이면 점프하지 않고 1이면 점프하는 것을 확인할 수 있었고 eax가 0이면 위에서 확인한 sub_402410으로 돌아가 스스로를 삭제하는 것을 확인할 수 있었다. 올바른 값을 입력하면 eax를 1로 반환하므로 loc_402B3F로 가서 분석을 해보자
처음에 ecx에 argv값을 넣고 edx에 두 번째 파라미터 값을 넣는다 그 뒤에 var_1820에 edx값을 넣은 뒤 “-in”을 푸시한다. 그리고 var_1820의 값을 eax로 옮기고 eax를 푸시한 뒤에 __mbscmp를 사용하여 비교하는데 값이 같을 경우 0을 반환한다. 그리고 다음을 보면
-re와 비교하는 것도 확인할 수 있고 또 다음을 살펴보면
-c와 -cc와도 비교하는 것을 확인할 수 있다. 각각의 인자들에 대하여 가볍게 살펴보면
-in명령어는 서비스를 생성하고 레지스트리 키를 생성한다.
-re명령어는 서비스를 오픈한 뒤에 서비스를 삭제하고 레지스트리 값 설정을 제거한다.
-c명령어는 레지스트리 구성 설정을 업데이트할 수 있다.
-cc명령어는 현재 설정을 레지스트리에서 읽어 문자열 형태를 가지고 콘솔에 문자열을 출력한다.
결론 이 파일을 실행시키는 다른 방법은 파일을 실행할 때에 인자를 두 개(-in,-re,-c,-cc중 하나 + abcd)를 주어 실행하면 된다.
이번 장을 공부하면서 IDA를 사용한 정적 분석에 좀 더 익숙해졌고 모르고 있던 API함수들의 개념도 알 수 있었고 알고 있었는데 가물가물 했던 API함수 들도 다시 한번 생각하고 배울 수 있었다.
3-1, 3-2, 3-3번은 Windows 7 32 bit 환경에서 실행되지 않기 때문에 분석하지 않았다.