실습 3-4

실습 환경 : Vmware (Windows 7 32 bit)

사용한 툴 : IDA Free, PEiD, String

[01] 이 파일을 실행했을 때 어떤 일이 발생했는가?

lab3-4 1

우선 PEiD를 사용하여 패킹 여부를 검사하니 패킹은 되어있지 않았다. 그리고 String을 사용하여 문자열을 찾아보니 아래와 같았다.

lab3-4 2

문자열을 살펴보니 URL형식의 문자열도 보이고 명령어 형식의 문자와 인자 같은 문자열들이 보였다. 이제 파일을 실행해 보니 조금 뒤 파일이 사라졌다. 아마 특정한 뭔가가 없으면 실행 시 자신을 삭제하는 파일인 것 같다.

[02] 동적 분석 시 장애물이 무엇인가?

이 파일은 위에서 처럼 뭔가 조건 없이 실행했을 경우 삭제가 되기 때문에 동적 분석을 하고 싶어도 할 수 없었다.

[03] 이 파일을 실행시키는 다른 방법이 있는가?

일단 파일을 IDA Free로 열어서 임포트 함수를 살펴보면 ADVAPI32.dll에서 서비스를 조작하는 함수와 레지스트리를 조작하는 함수들을 확인할 수 있었고 WS2_32.dll에서 네트워크 기능을 하는 것을 확인할 수 있었다. 이제 IDA를 통해 프로그램을 분석해보면

lab3-4 3

파일의 main을 살펴보면 파일 인자 값을 1과 비교해 인자 값이 하나가 아니면 loc_402B1D로 점프한다. 아무런 입력도 없이 파일을 실행했으므로 402B03으로 가서 분석을 해보면 아래와 같다.

lab3-4 4

여기서는 call sub_401000을 확인할 수 있는데 이 함수를 분석해보자

lab3-4 5

이 구간은 RegOpenKeyExA함수를 사용하여 SOFTWARE\microsoft \ XPS 레지스터 오픈을 시도하는데 XPS란 레지스터가 없으므로 0이 아닌 값을 반환하고 아래처럼 eax값을 0으로 초기화시킨 뒤 sub_401000에서 빠져나온다.

lab3-4 6

0을 반환하고 빠져나오기 때문에 위의 jz를 통해 loc_402B13으로 점프한다.

lab3-4 7

여기서 call sub_402410을 확인할 수 있는데 분석을 진행해보면

lab3-4 8

GetModuleFileNameA함수를 사용해 실행 파일의 경로를 가져오고 GetShortPathNameA함수를 사용하여 경로를 단축화 하여 가져온다. 밑으로 내려서 더 살펴보면

lab3-4 9

cmd를 shellExecuteA함수를 사용하여 열어서 /c del + 실행파일 경로 + » NUL인 명령어를 실행하여 자신을 삭제하는 것을 알 수 있었다. 인자 값이 하나일 경우를 살펴봤으므로 이제 main으로 돌아가 인자 값이 하나가 아닐 경우 점프하는 loc_402B1D를 살펴보자

lab3-4 10

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 함수를 분석해보자.

lab3-4 11

살펴보면 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를 분석해보자

lab3-4 12

eax에 마지막 파라미터 값을 집어넣고 eax의 한 바이트 값을 cl에 넣은 뒤 cl을 var_4에 저장하고 그 값을 다시 edx에 저장한 뒤 a(61h)와 비교하는 것을 볼 수 있다. 이걸 토대로 생각해보면 파일 실행 시 마지막 파라미터 4자리 중 앞자리가 a라는 것을 알 수 있다. 이제 loc_402542를 분석해보자

lab3-4 13

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을 분석해보자

lab3-4 14

처음엔 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을 분석해보자

lab3-4 15

분석을 진행해보니 al에 전에 var_4에 저장되어있던 63h값을 저장하고 1을 더하는 것을 확인할 수 있다. 그리고 그 값을 var_4를 거쳐 ecx에 저장하고 [edx+3] 즉 마지막 파라미터의 마지막 4번째 문자를 eax에 저장한 뒤 비교하는 것을 확인할 수 있으므로 마지막 파라미터의 마지막 문자는 d(64h) 임을 알 수 있다. 그리고 이 모든 문자들이 일치하면 loc_40259B로 점프한다.

lab3-4 16

여기선 eax값을 1로 만들고 함수를 종료하는 것을 확인할 수 있다. 이제 마지막 파라미터 값이 abcd인 것을 알았으므로 다시 돌아가서 분석해보자

lab3-4 10

다시 loc_402B1D로 돌아와 보면 test eax, eax를 사용하여 eax값을 검사해 eax가 0이면 점프하지 않고 1이면 점프하는 것을 확인할 수 있었고 eax가 0이면 위에서 확인한 sub_402410으로 돌아가 스스로를 삭제하는 것을 확인할 수 있었다. 올바른 값을 입력하면 eax를 1로 반환하므로 loc_402B3F로 가서 분석을 해보자

lab3-4 17

처음에 ecx에 argv값을 넣고 edx에 두 번째 파라미터 값을 넣는다 그 뒤에 var_1820에 edx값을 넣은 뒤 “-in”을 푸시한다. 그리고 var_1820의 값을 eax로 옮기고 eax를 푸시한 뒤에 __mbscmp를 사용하여 비교하는데 값이 같을 경우 0을 반환한다. 그리고 다음을 보면

lab3-4 18

-re와 비교하는 것도 확인할 수 있고 또 다음을 살펴보면

lab3-4 19

lab3-4 20

-c와 -cc와도 비교하는 것을 확인할 수 있다. 각각의 인자들에 대하여 가볍게 살펴보면

-in명령어는 서비스를 생성하고 레지스트리 키를 생성한다.

-re명령어는 서비스를 오픈한 뒤에 서비스를 삭제하고 레지스트리 값 설정을 제거한다.

-c명령어는 레지스트리 구성 설정을 업데이트할 수 있다.

-cc명령어는 현재 설정을 레지스트리에서 읽어 문자열 형태를 가지고 콘솔에 문자열을 출력한다.

결론 이 파일을 실행시키는 다른 방법은 파일을 실행할 때에 인자를 두 개(-in,-re,-c,-cc중 하나 + abcd)를 주어 실행하면 된다.

이번 장을 공부하면서 IDA를 사용한 정적 분석에 좀 더 익숙해졌고 모르고 있던 API함수들의 개념도 알 수 있었고 알고 있었는데 가물가물 했던 API함수 들도 다시 한번 생각하고 배울 수 있었다.

3-1, 3-2, 3-3번은 Windows 7 32 bit 환경에서 실행되지 않기 때문에 분석하지 않았다.