1. 분석 환경
1.1. 분석 환경
l Windows 10 l Windows XP (VMware) |
1.2. 분석 도구
정적 분석 | l IDA |
1.3. 분석 샘플
Practical Malware Analysis Labs - Lab07-01.exe |
1.4. 질문
이 랩에서는 Lab07-01.exe 파일에서 발견된 악성 코드를 분석합니다
- 이 프로그램은 컴퓨터가 다시 시작될 때 지속적으로 실행되도록 어떻게 보장되나요?
- 이 프로그램이 뮤텍스를 사용하는 이유는 무엇인가요?
- 이 프로그램을 감지하기 위한 좋은 호스트 기반 시그니처는 무엇인가요?
- 이 악성 소프트웨어를 감지하기 위한 좋은 네트워크 기반 시그니처는 무엇인가요?
- 이 프로그램의 목적은 무엇인가요?
- 이 프로그램은 언제 실행을 마치게 되나요?
2. 분석 과정
2.1. IDA분석
main함수를 살펴본다.
눈에 띄는 부분은 Malservice, StartServiceCtrlDispatcherA이다.
이 악성프로그램에 의해 “malservice”라는 서비스가 생성되고, StartServiceCtrlDispatcherA함수를 통해 제어될 것으로 추측된다.
StartServiceCtrlDispatcherA
서비스 제어 관리자(SCM)와 통신하여 서비스의 주요 제어를 담당한다.
서비스 메인 함수를 등록하고, 서비스 제어 신호를 처리할 수 있는 구조를 설정한다.
* (SCM은 “실행”에서 services.msc명령어를 입력하면 나오는 그 것이다.)
다음으로 호출하는 Sub_401040을 살펴본다.
Push offset Name ; “HGL345” / call ds:OpenMetexA : HGL345라는 값을 인자로 넣어 OpenMutexA함수를 실행한다.
Test eax,eax : 반환 값이 0 인지 test한다. 여기서 openmutexA는 mutex를 여는데 실패했을 경우 null을 반환한다.
Jz short loc_401064 test eax,eax의 값이 0 이라면 점프한다.
이 명령어들의 목적은 “HGL345”라는 뮤텍스가 존재하는지 열어서 확인해보는 것이다.
뮤텍스가 존재한다면 반환 값은 null이 아니므로 call ExitProcess 하여 프로세스는 종료된다.
만약 뮤텍스가 존재하지 않는다면 loc_401064로 점프하는데, call CreateMutexA함수을 사용하여 HGL345 뮤텍스를 생성하는 것을 볼 수 있다.
OpenSCManagerA : SCM을 연다.
GetCurrentProcess : 현재실행중인 프로세스의 핸들 값을 반환한다.
GetModuleFileNameA 은 매개변수 hModule의 값이 null(or 0) 일 경우 현재 프로세스의 실행 파일 경로를 검색하여 반환한다.
CreateServiceA : 서비스를 생성한다.
GetCureentProcess로 현재 실행중인 Lab07-01.exe의 핸들을 반환한다. 이 핸들을 사용하여 GetModuleFileNameA를 통해 Lab07-01.exe의 파일의 실제 경로를 가져온다.
그리고 이 경로 값을 사용해 CreateServiceA함수로 malservice라는 서비스를 생성한다.
즉. 이 명령어들의 목적은 Lab07-01.exe를 “Malservice”라는 이름의 서비스로 만들기 위함이다.
SystemTimeToFileTime : 시스템 시간형식을 파일시간 형식으로 바꾼다.
시스템시간은 년, 월, 일, 시, 분, 초로 사용자가 보기 편한 형태로 시간을 표현한다면, 파일 시간 형식은 1601년 1월 1일 자정부터의 100나노초 간격으로 표현된다. 그래서 사용자가 보기에 직관적으로 시간을 파악하기 어렵다는 점 이 있다.
여기서는 xor edx, edx로 edx값을 0으로 만든 뒤 FileTime과 Systemtime을 초기화 하는 것을 확인할 수 있다.
그리고 834h (=2100)값을 .wYear 인자에 넣어 SystemTimeToFileTime을 호출해 파일시간 형식으로 만든다.
결과적으로 “2100년 1월 1일”이라는 값을 파일시간형식으로 만든 것이다.
createWaitableTimerA : 대기가능한 타이머 객체를 생성한다.
이 타이머는 설정한 시간이 되면 해당 시간이 되었다고 신호를 준다.
Lea edx, [esp+410h+FileTime] / push edx / call ds:SetWaitableTimer 방금 생성한 filetime값을 edx에 저장하고, 인자로 push하여 SetWaitableTimer를 호출한다.
이 명령어의 과정을 통해 2100년 1월 1일이 되면 타이머 신호를 받게 된다.
이 프로세스를 대기시키는 과정이다.
0FFFFFFFFh ; dwMilliseconds는 무한히 대기하라는 의미이다.
WaitForSingleObject 는 시그널 상태, 즉 타이머 신호를 받을 때까지 대기하는데 사용된다.
Test eax, eax WaitForSingleObject은 시그널 상태가 될 때 0을 반환한다. 그러므로 test를 통해 이제 시그널 상태가 되었는지 확인하는 것이다.
Jnz short loc_40113B : 0이 아닐 경우 대기 루틴으로 점프한다.
즉 2100년이 오기전까지 무한히 대기하다 시그널 상태가 되면, 다음코드를 실행한다.
타이머 신호를 받으면 CreateThread로 스레드를 생성한다.
그래프를 보아하니 루프형태를 띄고 있는데, mov esi, 14h(=20) / dec esi / short loc_401126 으로 20부터 0이 될 때까지 1씩 감소시켜서 구문을 반복하게 한다.
이 반복문에서는 startAddress함수를 인자로 넣은 CreateTread를 호출한다. 즉 20개의 스레드가 생성되어 각각 startAddress의 내용을 수행하게 되는 것이다.
startAddress
User-agent Internet explorer 8.0을 사용하여 http://www.malwareanalysisbook.com 을 연다.
중요한 부분은 jmp short loc_40116D이다. 조건 없이 loc_40116D로 계속 점프해 반복하고 있어, http://www.malwareanalysisbook.com 에 접속하는 행위는 끝나지 않고 무한히 계속된다는 점이다.
결국 20개의 스레드에서 각각 악성사이트로 무한히 접속을 시도하며 이 때문에 시스템이 마비를 유발시킬 것이다.
이는 서비스 거부 공격인 DOS에 해당한다.
DOS와 DDOS의 차이점이란?
DOS는 단일 호스트에서 발생되지만 DDOS(분산서비스 공격)은 다수의 감염자 시스템이 하나의 시스템을 공격하는 행위를 의미한다.
2.2. 이 프로그램은 컴퓨터가 다시 시작될 때 지속적으로 실행되도록 어떻게 보장되나요?
답: malservice를 생성할 때 dwStartType 인자 값을 2로 설정하여 시스템이 시작될 때 서비스도 자동으로 시작되도록 하였다.
2.3. 이 프로그램이 뮤텍스를 사용하는 이유는 무엇인가요?
답: 동일프로그램을 중복으로 실행하지 않도록 하기위해 뮤텍스가 사용된다.
2.4. 이 프로그램을 감지하기 위한 좋은 호스트 기반 시그니처는 무엇인가요?
Malservice 서비스와 HGL345 뮤텍스가 생성된다.
2.5. 이 악성 소프트웨어를 감지하기 위한 좋은 네트워크 기반 시그니처는 무엇인가요?
User-agent : Internet explorer 8.0
http://www.malwareanalysisbook.com
2.6. 이 프로그램의 목적은 무엇인가요?
2100년 1월 1일 이 되면 20개의 스레드를 생성해 무한히 악성사이트에 접속을 하여 시스템을 마비시키려는 서비스거부공격이다.
2.7. 이 프로그램은 언제 실행을 마치게 되나요?
이 프로그램은 2100년 1월 1일에 시작되어 무한루프에 의해 끝나지 않고 계속 실행된다.