실전 악성코드와 멀웨어 분석 실습 9-1
OllyDbg와 IDA Pro를 사용해 파일 Lab09-01.exe에서 찾을 수 있는 악성코드를 분석해서 다음 질문에 답해보자. 이 악성코드는 3장에서 기본 정적과 동적 분석 기술을 사용해 기본적으로 분석됐다.
인자를 주지 않고 올리디버거로 디버깅 하였을 때
악성코드는 ShellExecuteA 함수를 통해 cmd로 자기 자신을 삭제하는 행위를 한다.
-in 인자를 주고 실행하였을 경우에도 역시 스스로 삭제하는 행위를 한다.
argc, argv는 메인함수의 각각 첫 번째 인자, 두 번째 인자이므로, EBP+8은 argc, EBP+C는 argv이다.
EAX는 argc를 가지고 있고, ECX는 argv를 가지고 있다.
그리고 EDX가 커맨드라인 인자로 들어온 요소들 중 마지막 요소를 가리키게 한다.
이 마지막 요소는 아래에서 확인할 수 있듯, 패스워드이다.
402510 함수 내용의 일부이다.
전달된 인자가 abcd인지 검증하는 내용의 코드이다. 즉, 인자 다음으로 전달되는 패스워드이다.
이렇게 코드를 분석하여 패스워드를 확인하는 방법 말고도 이 패스워드 검증 함수가 참을 반환하게 코드를 패치하는 방법도 있다.
그렇게 하기 위해서는 MOV EAX, 0x1과 RET 명령으로 코드를 패치한 파일을 실행시켜 -in 인자를 주고 의도한대로 처리가 되었는지 확인해야한다.
40380F는 IDA로 확인할 수 있듯이 mbscmp 함수이다. 스택에 쌓인 내용을 통해 같은 값이라는 것을 알 수 있다.
인자가 3개가 들어왔을 경우에는 서비스 이름을 인자로 하여 4025B0 함수를 호출한다.
4025B0 함수의 내용이다. 현재 실행중인 프로세스의 실행 파일명을 획득하기 위하여 __splitpath 함수를 호출한다.
ServiceName에 현재 실행 파일명이 저장된다.
ServiceName을 인자로 402600 함수가 실행된다.
EDX의 값에 해당하는 서비스가 존재하지 않으므로 함수는 0을 반환한다.
그리고 새로운 서비스를 생성하는데, CreateServiceA의 인자는 아래와 같다.
Lab09-01-patched Manager Service라는 이름으로 서비스가 생성된다.
자기 자신을 system32 폴더에 복사한다.
4014E0 함수의 인자로 두 가지 경로가 전달된다.
kernel32.dll의 핸들을 획득하고 있다.
kernel32.dll의 타임스탬프를 획득한다.
아까 획득한 타임스탬프를 자기 자신에 적용시키고 있다. 이렇게 타임스탬프를 다른 파일과 똑같게 변조하는 것을 타임스톰핑이라고 한다.
SOFTWARE\Microsoft \XPS라는 레지스트리 키를 생성한다.
그리고 Configuration이라는 값을 12C314 주소의 버퍼가 가리키는 내용으로 채운다.
버퍼의 데이터는 upx, http://www.practicalmalwareanalysis.com, 80, 60이라는 네 개의 문자열이다.
이러한 문자열은 악성코드가 네트워크 관련 기능을 하는 것으로 추측할 수 있는 증거가 된다.
정리하면, -in 인자는 서비스를 설치하는 옵션이다.
다른 커맨드라인 옵션을 알아보기 위해 strings로 확인한 결과이다.
-re 옵션은 서비스를 제거하고, system32에 있는 악성코드 사본을 삭제하고 레지스트리 값 역시 제거한다.
-c 옵션은 레지스트리 구성 키를 설정하는 옵션이다. 자세한 내용은 위에서 분석하였다.
-cc 옵션은 등록된 레지스트리 값을 가져와서 출력하는 역할을 한다.
마지막으로 어떤 인자도 입력하지 않았을 경우이다.
402360 함수의 일부분이다. 악성코드가 현재 설정을 가져와서 함수를 호출하고 몇 초간 sleep한 후 이 과정을 무한히 반복한다.
여기서 한 가지 주목할 점은 402020 함수이다.
이 함수는 인자로 http://www.practicalmalwareanalysis.com 이라는 문자열과 50h(80)이라는 포트번호를 받는다.
402020 함수 내에 있는 백도어 명령이다. 명령을 수신받았을 때 strncmp로 문자열 SLEEP과 비교하여 맞을 경우에
ecx에 들어있는 값 동안 Sleep 함수를 실행한다.
만약 수신한 명령어가 SLEEP이 아닌 UPLOAD일 경우에는
4019E0의 함수를 실행한다.
4019E0 함수는 파일을 생성하고,
수신 받은 데이터를 생성한 파일에 작성하는 명령을 수행한다.
명령어가 DOWNLOAD일 경우에는
파일을 생성하고,
생성한 파일의 내용을 읽어서,
전송하는 명령을 수행한다.
명령어가 CMD일 경우에는,
__popen 함수로 cmd 명령어를 실행하고, 그 반환 값을 401790 함수로 전달한다.
그러면 _fread 함수는 해당 파일에 대한 내용을 읽어 send 함수로 원격 호스트에 전송한다.
마지막으로 NOTHING 명령어는 어떤 행위 없이 프로그램을 종료시킨다.
SLEEP | 일정 시간동안 SLEEP |
UPLOAD | 수신 받은 데이터를 파일로 저장 |
DOWNLOAD | 파일의 내용을 원격 호스트로 전송 |
CMD | CMD로 명령을 실행하고, 해당 내용을 원격 호스트에 전송 |
NOTHING | 동작 없음 |
백도어 명령을 정리한 표이다.
1. 어떻게 하면 악성코드가 자신을 설치하게 할 수 있는가?
-in 옵션과 패스워드를 입력하거나, 패스워드 검증 부분 코드 패치를 한다.
2. 이 프로그램의 커맨드라인 옵션은 무엇인가? 패스워드 요건은 무엇인가?
패스워드는 abcd이고, 커맨드라인 옵션은 아래와 같다.
- -in 서비스 설치
- -re 서비스 제거
- -c 레지스트리 구성 키 설정
- -cc 등록된 레지스트리 값을 출력
3. 이 악성코드가 특수 커맨드라인 패스워드를 요구하지 않게 영구 패치하려면 OllyDbg로 어떻게 해야 하는가?
항상 참을 반환하게 코드를 EAX에 1을 넣어주어 패스워드 검증 부분을 넘긴다.
4. 이 악성코드의 호스트 기반 지표는 무엇인가?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \XPS\Configuration 레지스트리 키를 생성한다.
파일이름+Manager Servcie 라는 이름의 서비스가 생성되었다.
5. 이 악성코드가 네트워크를 통해 수행할 수 있는 다른 행동은 무엇인가?
SLEEP | 일정 시간동안 SLEEP |
UPLOAD | 수신 받은 데이터를 파일로 저장 |
DOWNLOAD | 파일의 내용을 원격 호스트로 전송 |
CMD | CMD로 명령을 실행하고, 해당 내용을 원격 호스트에 전송 |
NOTHING | 동작 없음 |
악성코드는 네트워크를 통해 위 다섯가지 명령을 수신받아 행동한다.
6. 이 악성코드에 대한 유용한 네트워크 기반 시그니처가 있는가?
http://www.practicalmalwareanalysis.com/; 으로 통신하고, HTTP/1.0 GET 요청을 한다. 이 때의 문자열은 무작위로 구성한 문자열이다.