Practical Malware Analysis 9-1
실습 9-1
실습 환경 : Vmware (Windows 7 32 bit)
사용한 툴 : IDA Free, Ollydbg, Strings
이번 악성코드는 실습 3-4에서 IDA free를 사용해 분석을 해보았고 이번엔 Ollydbg를 사용해 분석을 진행해 봤다.
ollydbg로 프로그램을 실행하면 처음에 주소 0040896에서 멈추는 것을 확인할 수 있다. 계속 분석을 진행해보면 00403945에서 00402AF0로 점프하는 것을 확인할 수 있는데 여기가 바로 프로그램의 OEP이다. 이제 00402AF0를 분석해보면
처음에 스택에 값을 설정하고 프로그램 실행시 입력한 파라미터의 값이 1 즉 argc 값이 1이면(프로그램 실행시 아무런 인자 값을 주지 않으면) 점프하지 않고 401000함수를 실행하는데 분석을 해보면
RegOpenKeyEx 함수를 사용하여 SOFTWARE\Microsoft \XPS 레지스트리 오픈을 시도하는데 레지스트리 키가 존재하지 않으므로 0이 아닌 값을 반환하여 점프하지 않고 XOR eax, eax를 통해 eax값을 0으로 초기화 한 후에 함수를 종료한다. 이제 다시 돌아가서 살펴보면
위에서 0을 반환하고 함수를 종료했기 때문에 jz문에 의해 00402B13으로 점프하게 되고 00402410 함수를 실행하는데 이 함수를 살펴보면
GetModuleFileName 함수를 사용하여 현재 파일의 경로를 가져오고
위와 같이 edx레지스터에 /c del 파일경로 » NUL을 구성한다. 그리고 ShellExecuteA 함수로 cmd.exe를 호출하여 해당 명령어를 실행하면 파일은 스스로를 삭제하 함수를 종료한다.
즉 프로그램을 실행할 때에 인자 값을 주지않으면 프로그램이 스스로를 삭제하는 것 같다. 이제 어떤 인자 값이 필요한지 Strings를 통하여 문자열을 찾아보면
실습 3-4 때와 마찬가지로 여러 문자열을 확인할 수 있는데 -in, -re, -cc 문자열이 파라미터라고 추측해 볼 수 있었다. 그렇다면 이제 인자 값을 주고 프로그램을 실행해보자
인자 값 -in을 주고 프로그램을 실행해보니 00402B1D로 점프하는 것을 확인할 수 있었다.
계속 분석을 해가면 argc의 값을 eax에 넣고 argv의 값을 ecx에 넣은 뒤 edx에 입력한 인자 값의 마지막 값을 집어 넣고 eax로 옮겨 00402510 함수의 파라미터로 푸시 한 후에 함수를 실행하는 것을 확인할 수 있었다. 지금 경우에는 -in이 입력한 인자 값의 마지막 값이므로 -in이 edx 레지스터에 들어가 있다.
이제 함수 00402510이 무슨일을 하는지 살펴보자
처음에 402515에서 입력한 인자 값의 마지막인 -in을 edi 레지스터에 넣는 것을 볼 수 있다. 그 후 ecx를 0xffffffff과 or 시켜 ecx 값을 ffffffff으로 만든 뒤에 eax를 0으로 초기화 한다.
그리고 repne scas를 이용하여 eax와 edi 값을 비교하고 ecx의 값을 하나씩 뺀뒤 not ecx를 통하여 인자 갑의 문자 수를 계산한다. 그리고 -1을 뺀뒤 4와 비교하여 같지 않으면 eax를 0으로 초기화 하고 함수를 종료하는데 이는 입력해야할 마지막 인자 값이 4글자 여야 한다는 것을 의미한다.
이에 추측을 해보면 프로그램 실행시 프로그램.exe -in 4개의 문자 이런식으로 실행해야 되는 것으로 생각해 볼 수 있다.
계속해서 분석해보면
마지막 파라미터 인자 값을 한글자 가져와 61과 비교하여 같지 않으면 점프하는 것을 확인할 수 있으니 첫 번째 문자는 0x61(a)인 것을 확인할 수 있고
이제 두 번째를 확인해 보면 eax에 인자 값을 넣은 뒤 cl에 eax+1 값인 인자 값의 두 번째 문자를 넣고 al에 옮기고 edx에 다시 인자 값을 넣은 뒤 이 둘을 빼고 결과 값이 1이 아니라면 종료하게 된다.
첫 번째 문자가 a임을 알고 있으므로 두 번째 문자가 b라는 것을 확인할 수 있다.
세 번째를 살펴보면 두 번째에서 나온 값인 1을 al에 넣고 dl에 63을 넣은 뒤 곱한 값을 al에 넣으므로 al은 63이 되고 ecx에 마지막 파라미터 값을 넣고 edx에 파라미터 세 번째 값을 넣은 뒤 비교하여 같지 않으면 종료하므로 세 번째 문자는 c인 것을 확인할 수 있다.
네 번재를 살펴보면 al에 63 값을 넣고 +1하여 64를 만든 뒤 ecx에 넣고 eax에 파라미터의 네 번째 값을 넣은 뒤 비교하여 틀리면 eax를 0으로 초기화 하고 종료하고 맞으면 eax를 1로 설정하고 종료하는 것을 확인할 수 있으므로 네 번째 값은 d라는 것을 알 수 있다.
즉 마지막 파라미터로 입력해야하는 값은 abcd 이다. 프로그램 실행시 프로그램.exe -in abcd 이런식으로 인자를 줘서 실행하면 종료하지 않고 정상 동작한다.
계속 분석을 진행해보자
살펴보면 0040380F 함수를 볼 수 있는데 이는 IDA Free로 살펴본 결과 msbcmp 함수인 것을 확인할 수 있엇다. 즉 -in 문자열과 입력한 인자 첫 번째 인자 값이 -in인지 비교하여 동일하면 eax에 0을 반환하는데 -in인자를 입력한 뒤 실행하여 살펴보면
argc와 3을 비교하여 입력한 인자 값이 3과 같은지 확인하여 같을 경우 점프하지 않고 같지 않으면 점프하여 종료하는 것을 볼 수 있었습니다. 즉 입력한 인자 값이 3개가 되어야 한다는 것을 확인할 수 있었습니다.
계속해서 살펴보면 004025B0 함수를 호출하는 것을 확인할 수 있는데 이를 분석해 보면 GetModuleFileName 함수로 실행파일의 경로를 가져오고 splitpath 함수를 사용해 .exe를 ecx에 반환한 뒤 eax를 0으로 초기화 하고 빠져나온다.
빠져나온 뒤 살펴보면 jz문을 확인할 수 있는데 eax를 0으로 초기화 한뒤 빠져나왔으므로 jz문을 통해 점프하게 된다. 그리고 계속해서 살펴보면 edx에 lab09-01 문자열을 넣고 00402600 함수를 호출하는 것을 볼 수 있는데 이 함수를 분석해보려 했으나 OpenSCManger 함수가 핸들을 제대로 불러오지 못하여 진행을 할 수 없으므로 IDA를 사용해 분석을 진행해보면
스택에 값을 할당하고 004520B0 함수를 호출하는데 이 함수는 위에서 분석했듯이 실행파일의 경로를 가져오고 spilcpaht를 사용하여 ecx 에 .exe 값을 넣고 eax 0을 반환한다.
분석을 진행해보면 OpenSCManger함수를 사용하여 scm 핸들을 가져오고
OpenService 함수로 서비스를 여는데 여는데 실패하여 0을 반환하면
Manager Service라는 이름으로 바이너리 경로를 %SYSTEMROOT%\system\파일 이름 으로 하여 자동으로 시작하는 서비스를 생성한다. 생성이 성공적으로 완료 되었으면
서비스 핸들을 종료하고
환경 변수와 실행파일 경로를 가져와
%SYSTEMROOT%\system32\에 자신을 복사하는 것을 확인할 수 있었다. 성공적으로 자신을 복사하면
004015B0 함수를 호출하는 것을 볼 수 있는데 분석을해보면
GetSystemDirectory 함수를 사용하여 인자로 입력받은 copyfile의 시스템 디렉터리 경로를 구하고
\kernel32.dll과 파일이름을 가져와 004014E0 함수를 실행하는데 이를 분석해보면
CreateFile을 사용해 kernel32.dll을 연 뒤 GetFileTime 함수를 사용하여 생성, 수정, 접근한 시간정보를 가져온 뒤
다시한번 CreateFile 함수를 사용해 CopyFile로 복사한 파일을 불러와 시간 값을 kernel32.dll과 동일하게 세팅하는 것을 확인할 수 있는데 이처럼 타임스탬프를 다른 파일과 일치하게 변조하는 행위를 타임스톰핑 이라고 한다.
타임스톰핑을 완료한 후에 함수를 빠져나오고 분석을 진행해 보면 위와같이 00401070 함수를 확인할 수 있다. 이를 분석해보면
RegCreateKeyEx 함수를 사용하여 HKLM\SOFTWARE\Microsoft \XPS를 생성하고
RegSetValueEX 함수를 사용하여 Configuration에 값을 쓰는데 이 데이터는 위에서 살펴볼 수 있었던 ups http://www.practicalmalwareanalysis.com 80 60 임을 알 수 있다. 이는 악성코드가 네트워크 기능을 하는 것 처럼 보인다.
즉 -in 인자는 서비스를 설치하는 것으로 보인다.
이제 인자 값이 -re 일때를 한번 살펴보면
서비스 관리자를 오픈하여 서비스를 생성한 뒤에 서비스를 삭제하고 레지스트리를 생성한 뒤에 레지스트리 값도 제거하는 것을 확인할 수 있었다.
즉 -re 옵션은 서비스를 제거하는 옵션인 것 같다.
-c 옵션을 분석해보면
argc 값을 7이랑 비교하는 것을 봐선 뒤에 몇개 인자 값을 더 줘야 하는 것을 확인할 수 있고 00401070 함수를 확인할 수 있는데 살펴보면
4개의 파라미터를 받아서 파라미터 문자열을 모두 합친 뒤 HKLM\SOFTWARE\Microsoft \XPS에 Configuration이라는 레지스트리 값으로 설정하는 것을 확인할 수 있었다.
이 함수가 눈에 익어 상호 참조 기능을 통해 살펴보니
-in 인자와 -re 인자 에서도 이미 이 함수에 진입했음을 알 수 있었다.
즉 -c 인자는 악성코드 사용자가 레지스트리 설정을 업데이트 할 때 사용하는 것 같다.
이제 -cc 인자 값이 무엇을 하는지 분석을해보자
00401280 함수를 확인할 수 있는데 이를 분석해보면
RegQueryValueEx 함수를 사용하여 레지스트리 값에서 데이터를 불러와
k:%s h:%s p:%s per:%s 형식으로 출력하는 것을 확인할 수 있다. 00402E7E 함수는 살펴보니 printf 였다.
즉 -cc 인자를 주면 레지스트리 값을 읽여와 printf로 콘솔에 출력하는 것을 알 수 있었다.
이제 마지막으로 아무런 파라미터를 제공하지 않았지만 레지스터에서 값을 찾을 수 있는 경우를 살펴보면
eax에 1을 넣고 test eax, eax를 진행하고 jz문을 사용하여 점프 여부를 결정하는데 eax 값이 1이므로 점프 하지 않는데 다음을 살펴보면 00401280 함수를 살펴볼 수 있는데 이는 위에서 분석한 것과 같이 레지스트리 값에서 데이터를 불러온다.
계속 살펴보면 402020 함수를 확인할 수 있는데 이 함수는 조금 복잡해서 분석하기 어려웠다. 그래서 책을 살펴봤는데 주소 401E60에 시작하는 함수를 호출하고 문자열 시작 부분을 SLEEP, UPLOAD, DOWNLOAD, CMD, NOTHING과 비교하고 악성코드가 이 문자열 중 하나와 만나면 커맨드라인 인자를 파싱하는 과정과 유사하게 요청에 대응하는 함수를 호출한고 한다.
그리고 요청을 완료하면 eax에 0을 반환하고 함수를 종료하는데
402360으로 돌아가 살펴보면 sleep한 후 점프하여 무한히 프로세스를 반복하는 것을 확인할 수 있었다.
이제 전체적으로 요약을 하면 이 악성코드는 백도어 임을 알 수 있다. 악성코드 실행, 설정, 삭제에 마지막 파라미터로 abcd를 입력해야 된다. 그리고 자신을 %SYSTEMROOT%\Windows\system32 디렉터리에 복제한 후 자동으로 실행하는 서비스를 생성한다. -re 커맨드로 삭제할 수 있으며 -c를 사용해 재설정 할 수 있다.
설치 이후 실행하면 악성코드는 서버 설정 정보를 가져오는 레지스트리 키를 이용해 원격 시스템에 HTTP/1.0GET 요청을 하고 악성코드는 5개의 SLEEP, UPLOAD, DOWNLOAD, CMD, NOTHING 5개의 명령어를 인지한다.
[01] 어떻게 하면 악성코드가 자신을 설치하게 할 수 있는가?
프로그램을 실행할 때 -in 인자와 패스워드 abcd를 입력하여 설치할 수 있다.
[02] 이 프로그램의 커맨드라인 옵션은 무엇인가? 패스워드 요건은 무엇인가?
-in 옵션은 서비스를 설치하는 옵션이고 -re는 서비스를 삭제하는 옵션 -c는 악성코드의 구성을 재설정 하고 -cc 옵션은 콘솔로 현재 구성을 출력한다. 패스워드는 문자 abcd 이다.
[03] 이 악성코드가 특수 커맨드라인 패스워드를 요구하지 않게 영구 패치하려면 Ollydbg로 어떻게 해야 하는가?
위에서 확인한 패스워드 확인 함수인 00402510에서 항상 참을 반환하게 바이너리 패치를 진행한다. MOV eax, 1; retn; 으로 설정
[04] 이 악성코드의 호스트 기반 지표(Indicator)는 무엇인가?
악성코드는 HKLM\Software\Microsoft \XPS\Configuration에 레지스트리 키를 생성하고 ManagerServie라는 서비스를 생성하는데 호스트 기반의 지표로 사용할 수 있다.
[05] 이 악성코드가 네트워크를 통해 수행할 수 있는 다른 행동은 무엇인가?
네트워크를 통해 SLEEP, UPLOAD, DOWNLOAD, CMD, NOTHING 다섯 명령어중 하나를 실행하게 명령을 받는다. SLEEP은 특정시간동안 아무런 명령을 하지 않도록 하는 명령이고 UPLOAD는 네트워크에서 파일을 읽어 로컬 시스템 특정 경로에 작성한다. DOWNLOAD는 악성코드가 로컬 파일을 외부 호스트로 전송하게 하고 CMD는 쉘 명령어를 실행하게 한다. NOTHING 명령어를 입력 받으면 아무런 일도 하지 않는다.
[06] 이 악성코드에 대한 유용한 네트워크 기반 시그니처가 있는가?
악성코드는 http://www.practicalmalwareanalysis.com으로 통신한다.
이번 실습을 하면서 어려운 점이 많았다. 특히 Ollydbg를 사용하여 분석을 하는데 OpenSCManger부분에서 실행이 안되어 IDA로 분석을 진행한 것과 분석 후반부에 백도어 기능을 하는 부분과 외부 호스트에서 악성코드가 통신을 하는 부분을 분석하는데 정말 어렵고 복잡하게 느껴져 책을 참고하여 진행하였다. 아직 공부할게 많다는 것을 느낀 실습이었다.