[실전 악성코드와 멀웨어 분석] 실습 문제 3-3
[실전 악성코드와 멀웨어 분석] 책의 실습 문제3-3(Lab03-03.exe)를 분석한다. 분석 환경은 윈도우XP이다.
기초 정적 분석
그림 1 바이러스 토탈
그림1에서 바이러스 토탈은 Lab03-03.exe가 52개의 백신이 악성코드로 판별했다.
그림 2 바이러스 토탈
그림2에서 해당 악성코드는 하이재커로 추정된다.
다음은 Strings.exe로 악성코드의 문자열을 살펴본다.
그림 3 Strings.exe
그림 4 의심스러운 문자열
해당 악성코드는 \svchost.exe, "AAAAAAA…" 문자열을 포함하고 있다.
다음은 dependency walker로 사용된 임포트 함수를 확인한다.
그림 5 dependency walker
그림 6 임포트 함수
그림6는 악성코드에 잘 사용되는 임포트 함수이다. CreateProcessA 함수는 자식 프로세스를 생성할 것이다. LoadResource함수는 리소스 섹션에서 데이터를 뽑는다. ReadProcessMemory 함수와 WriteProcessMeomry함수는 타 프로세스에 정보를 읽고 쓰기를 한다. WriteFile 함수는 어떤 파일을 생성할 것이다.
다음은 Resource Hacker로 리소스를 확인한다.
그림 7 Resource Hacker
그림7에서 해당 악성 코드는 LOCALIZATION 이라는 이름을 가진 리소스가 존재한다. 하지만 리소스 데이터가 상당히 의심스럽다. 고급 분석할 때 자세히 살펴보자.
기초 동적 분석
기초 동적 분석에서는 Procexp , Procmon를 사용하겠다. 기초 동적 분석을 할 때는 모든 분석 프로그램을 실행 후에 악성 코드를 실행해야 한다.
먼저 Procexp로 프로세스 목록을 확인한다.
그림 8 자식 프로세스인 svchost.exe 생성
그림 9 부모 프로세스 삭제
그림 10 svchost.exe만 남음
악성코드의 동작 과정은 그림8 ~ 그림10와 같다. Lab03-03.exe은 자식 프로세스인 svchost.exe를 생성하고 자기 자신은 사라진다. 생성된 svchost.exe을 클릭하여 분석한다.
그림 11
그림11에서 생성된 svchost.exe는 디스크와 메모리에 있는 문자열이 상당히 다른 것으로 보아 악성 코드로 추측된다 (일반적인 svchost.exe는 디스크와 메모리의 문자열이 비슷하다)..
다음은 Procmon로 프로세스의 동작을 살펴본다.
그림 12 필터링
Lab03-03.exe는 svchost.exe를 생성하고 자신은 사라진다. 그러므로 svchost.exe를 중점으로 분석해야 한다. 그림12에서 svchost.exe의 PID로 필터링했다.
그림 13 c:\work\practicalmalwareanalysis.log 생성
그림13에서 생성된 svchost.exe는 반복해서 practicalmalwareanalysis.log를 생성한다. 해당 파일을 확인해보자.
그림 14 practicalmalwareanalysis.log
그림14에서 practicalmalwareanalysis.log 파일에 입력한 키보드 값이 저장됐다. 즉 해당 악성코드는 키로거이다.
고급 정적 분석
급 정적 분석은 아이다 프로(IDA Pro)를 이용한다.
그림 15 main 함수
그림15에서 main 함수는 sub_40149D, sub_40132C, sub_4010EA 함수를 가진다. 각각의 함수를 분석하자.
그림 16 sub_40149D
그림16에서 sub_40149D는 Str 변수에 "C:\windows\system32\svchost.exe" 문자열 의 주소를 저장한다. 즉 그림 15의 Dst 변수에 해당 문자열의 주소를 저장한다. 다음은 그림15의 sub_40132C를 살펴보자.
그림 17 sub_40132C
그림17에서 sub_40132C는 LOCALIZATION 이라는 이름을 가진 리소스를 메모리에 할당한다. 할당 된 포인터는 Src 변수다. VirtualAlloc 함수로 새로운 메모리를 할당 받고 해당 포인터는 Dst 변수 이다. 그리고 Dst 변수에 리소스를 복사한다 (memcpy(Dst, Src, Size)). 마지막으로 Dst 변수를 result 변수에 저장하고 리턴한다. 이 리턴 값은 그림 15의 lpbuffer 변수에 복사된다.
그림 18 sub_4010EA
그림18는 sub_4010EA 함수의 코드이다. 1번에서 자식 프로세스로 C:\windows\system32\svchost.exe를 생성한다. 그리고 6번째 인자가 CREATE_SUSPENDED(0x4) 임을 주목하자. CREATE_SUSPENDED 모드는 프로세스가 정지된 상태로 생성된다(ResumeThread 함수로 재개된다). 2번에서 ReadProcessMemory 함수는 svchost.exe의 메모리에서 특정한 데이터를 뽑아온다. 여기서 두 번째 인자인 (LPVOID)(lpContext->Ebx + 8)를 주목하자. svchost.exe는 CREATE_SUSPENDED 모드로 생성됐기 때문에 정지된 상태다. 이때 Ebx 레지스터는 PEB 구조체를 가리킨다. 즉 svchost.exe의 ImageBase(Ebx+8)를 3번째 인자인 Buffer에 복사한다. 3번과 4번에서 WriteProcessMemory 함수는 svchost.exe의 메모리에 리소스의 특정한 데이터를 복사한다 (3번째 인자인 lpBuffer은 리소스를 가르키는 포인터). 5번에서 Context 구조체의 Eax 레지스터에 어떠한 값을 저장하고 SetThreadcontext 함수를 호출한다. 정지된 프로세스가 6번의 ResumeThread 함수에 의해서 실행될 때, EIP 레지스터는 Eax 레지스터를 참조한다. 즉 5번은 정지된 프로세스의 코드 시작점을 바꾼다.
지금까지 자세하게 고급 정적 분석을 했다. 다음은 고급 동적 분석을 한다.
고급 정적 분석
저번 페이지와 마찬가지로 svchost.exe 를 디버깅 못하겠내요.. 알게되면 업데이트 하겠습니다…