참고 도서 : [Practical Malware Analysis: 실전 악성코드와 멀웨어 분석]
저자 : 마이클 시코스키, 앤드류 호닉
출판사 : 에이콘
참고 사이트 :
- [Microsoft] GetModuleHandle function
- [Solvusoft] Vssadmin.exe은(는) 무엇이고 어떻게 해결하죠?
- [다시 시작하는 윈도우 프로그래밍] 메모리 이야기 (2)
- [zrungee library] 안티디버깅 - IsDebuggerPresent
- [Zero's hobby blog.] [winAPI] ProcessToken, AccessToken
- [머리 속 하드디스크] 윈도우 핸들 (Window Handle Object)
- [형기의 자료공간 시즌2] 데이터 실행 방지(Data Execution Prevention) #1
- [NAVER 지식 iN] SYSTEM_PROCESS_INFORMATION 의 멤버의 정체가 궁금합니다.
- [Microsoft] NtQueryInformationProcess function
Buster Sandbox Analyzer를 이용한 분석 (4)
[ Log_API.txt ]
분석 환경 : Windows 7
동작하는 Windows API 함수를 확인한다.
Executing: C:\Windows\System32\vssadmin.exe
Shadow Copy 섀도 복사본 (Shadow Copy, 볼륨 스냅샷 서비스)는 특정한 시각의 파일, 폴더 또는 특정한 볼륨의 수동 또는 자동 복사본이나 스냅샷을 저장해 둔 것을 말한다. 윈도우는 현재 볼륨 섀도 복사본 백업과 설치된 모든 섀도 복사본 기록자, 공급자들을 처리할 수 있는 명령어인 vssadmin을 포함하고 있다. Vssadmin.exe Vssadmin.exe은(는) Windows 운영 시스템을 위해 International Geogebra Institute에서 개발한 Betriebssystem Microsoft(R) Windows(R)와(과) 관련된 EXE 파일 유형이다.
|
GetModuleHandle(user32.dll) [c:\windows\system32\vssadmin.exe]
GetModuleHandle을 통해 윈도우에 로드되어 있는 user32.dll에 대한 인스턴스를 받아온다.
GetModuleHandle Function Retrieves a module handle for the specified module. The module must have been loaded by the calling process. To avoid the race conditions described in the Remarks section, use the GetModuleHandleEx function. HMODULE WINAPI GetModuleHandle (_In_opt_ LPCTSTR lpModuleName ); GetModuleHandle로 먼저 윈도우에 로드되어 있는 DLL이나 EXE에 대한 인스턴스를 받아온다.
|
CreateThread() [c:\windows\system32\vssadmin.exe]
쓰레드를 생성한다.
ResumeThread(3656) [c:\windows\system32\vssadmin.exe]
쓰레드 계속하기
Suspend Thread - 쓰레드 일시 정지
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_RESERVE, PAGE_READWRITE, RegionSize=0x00150000) [c:\windows\system32\vssadmin.exe]
원격 프로세스에서 메모리를 할당할 수 있는 메모리 할당 루틴이다. 즉, 타 프로세스의 힙 영역을 확보하고 대상 프로세스 내에서 DLL 경로를 넣기 위한 메모리를 할당한다. 악성코드는 때때로 VirtualAllocEx를 프로세스 인젝션의 일부로 사용한다.
C:\\Windows\System32\vssadmin.exe : 할당할 베이스 주소 번지
MEM_RESERVE : 메모리 예약
PAGE_READWRITE : 할당 받은 메모리에 대한 액섹스 권한. 읽기, 쓰기 가능
RegionSize=0x00150000 : 할당할 크기
가상 메모리 할당 가상 메모리 함수는 크게 일반 함수와 Ex 함수로 나뉜다. Ex 함수는 다른 프로세스의 메모리를 조작할 수 있다는 추가적인 점 외에는 일반 함수와 기능면에서 100% 동일하다. 가상 메모리를 할당하기 위해서 윈도우는 VirtualAlloc, VirtualAllocEx라는 두 가지 API를 제공한다. LPVOID VirtualAlloc (LPVOID lpAddress, SIZE_T dwSize, DWORD fAllocationType, DWORD fProtect); 현재 프로세스의 주소 공간에 메모리를 할당하는 역할을 한다. 특정 프로세스의 주소 공간에 할당하는 기능을 추가적으로 가지고 있다. - lpAddress : 할당할 베이스 주소 번지를 지정 NULL인 경우 시스템이 알아서 비어있는 공간을 찾아서 할당한다. lpAddress는 예약 (MEM_RESERVE) 작업을 수행하는 경우에는 내부적으로 페이지 할당 단위의 배수로 조정된다. - dwSize : 할당하려고 하는 메모리 크기를 지정 lpAddress가 NULL이 아닌 경우에는 해당 크기 영역을 포함하는 모든 페이지가 포함되도록 조정한다. - fAllocationType : 할당하려고 하는 타입 MEM_COMMIT : 메모리 할당 MEM_RESERVE : 메모리 예약 MEM_RESET : 해당 페이지들을 현재 사용하지 않는다는 것을 운영체제에 알려줌. 해당 페이지들은 스왑되에 페이지 파일에 기록 - fProtect : 페이지 보호 속성을 지정 PAGE_EXECUTE : 이 페이지는 실행 가능하다. 해당 페이지에 읽기, 쓰기 접근을 시도하는 경우 잘못된 접근 오류가 발생 PAGE_EXECUTE_READ : 이 페이지는 실행, 읽기 작업이 가능하다. PAGE_EXECUTE_READWRITE : 이 페이지는 실행, 읽기, 쓰기 작업이 가능하다. PAGE_NOACCESS : 이 페이지는 어떠한 작업도 허용되지 않는다. PAGE_READONLY : 이 페이지는 읽기 작업만 가능하다. PAGE_READWRIGHT : 이 페이지는 읽기, 쓰기 작업이 가능하다. |
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_COMMIT, PAGE_READWRITE, RegionSize=0x00001000) [c:\windows\system32\vssadmin.exe]
LoadLibrary(?????l) [c:\windows\system32\vssadmin.exe]
프로그램을 시작할 때 로드하지 않은 프로세스로 DLL을 로드한다. 거의 모든 win32 프로그램이 임포트한다.
IsDebuggerPresent() [c:\windows\system32\vssadmin.exe]
현재 프로세스가 디버깅 중인지 여부를 PEB 구조체의 디버깅 상태 값을 통해 확인한다. (리턴 값 - 디버깅 중 : 1 / 디버깅 아닐 때 : 0) 이 함수로는 커널 모드의 디버거는 탐지하지 못하고, 유저 모드의 디버거만 탐지 가능하다. 안티디버깅 기법의 일부로 종종 사용한다. 이 함수는 컴파일러가 종종 추가해 많은 실행 파일에 포함되어 있으므로 단순히 이 함수를 임포트한 사실만으로 알아낼 수 있는 정보는 거의 없다. kernel32.dll에서 export 되는 함수이며, 보통 프로그램의 보호 차원에서 쓰이지만 우회 방법이 많다.
FreeLibrary(C:\Windows\system32\uxtheme.dll) [c:\windows\system32\vssadmin.exe]
프로세스 내의 쓰레드에서 더이상 DLL 파일 내의 심볼을 사용할 필요가 없게 되면, FreeLibrary 함수를 호출하여 프로세스의 주소 공간으로부터 DLL 파일을 명시적으로 unload 할 수 있다. 프로세스의 DLL usage count를 감소시킨다. usage count가 0이 되면, 시스템은 프로세스의 주소 공간으로부터 DLL 파일 이미지를 매핑 해제 한다.
BOOL FreeLibrary (HMODULE hInstDll);
- hInstDll : LoadLibrary(Ex)의 반환값을 넘겨주면 된다.
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_COMMIT, PAGE_READWRITE, RegionSize=0x00004000) [c:\windows\system32\vssadmin.exe]
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_COMMIT, PAGE_READWRITE, RegionSize=0x00007000) [c:\windows\system32\vssadmin.exe]
OpenProcessToken(C:\Windows\System32\vssadmin.exe, TOKEN_DUPLICATE, TOKEN_QUERY, TOKEN_READ) [c:\windows\system32\vssadmin.exe]
Windows의 Token은 계정의 권한과 같은 개념으로 Token 관련 API이다.
BOOL WINAPI OpenProcessTocken(
_In_ HANDLE ProcessHandle, // Token을 얻어올 프로세스 핸들
_In_ DWORD DesiredAccess, // 해당 프로세스에서 필요한 액세스 권한
_Out_ PHANDLE TockenHandle // 얻어온 토큰이 저장될 핸들
);
Handle 커널 오브젝트 (혹은 GDI, 사용자 오브젝트)를 사용하기 위해 필요한 하나의 장치이다. 프로세스가 초기화되면 운영체제는 프로세스가 커널 오브젝트를 사용할 수 있게 하려고 핸들 테이블을 할당하게 된다. (GDI, User 오브젝트는 핸들 테이블을 할당하지 않는다. 고유의 핸들 값만 받아서 바로 사용한다.) 핸들 테이블 - 커널 오브젝트의 메모리 블록을 가리키는 포인터 - 액세스 마스크 (Access Mask) : 접근 권한 - 플래그 (Flag) 운영체제가 발급해 주는 것을 받아서 쓸 뿐, 직접 만들 수는 없다. 대상을 빠르게 구분하기 위해 정수형을 사용하며 중복되지 않는다. 파일, 브러쉬, 펜, 폰트 등을 모두 핸들을 붙여 번호로 관리한다. 프로세스가 직접 커널 오브젝트를 사용하지 않고 OS로부터 핸들을 할당 받는 이유 - 관리적 측면 - 프로세스가 직접 커널 오브젝트에 접근에 사용하면 어떤 프로세스가 커널 오브젝트를 사용하는지, 프로세스가 접근해서는 안 될 커널 오브젝트에 접근하는지 등을 OS가 파악하기 쉬워진다. 파일 핸들도 메모리를 차지하므로 사용하고 난 후에는 해제하는 것이 원칙이다. 파일을 닫지 않았더라도 프로그램이 종료될 때 열려진 모든 파일은 자동으로 닫혀진다. 프로세스가 종료될 때는 열려있던 모든 핸들이 닫히게 된다. (1) 특정 프로세스가 오브젝트 생성을 요청하여 받은 핸들은 무언가의 "핸들 리스트"로 관리될 것이다. (2) OS는 프로세스가 종료되면 "핸들 리스트"를 보고 생성되어 있는 오브젝트를 모두 파괴한다. (3) 핸들은 오브젝트에 대한 참조 ID일 뿐이므로 오브젝트가 파괴된 후, 해당 핸들 값은 의미가 없다. |
OpenProcessToken(C:\Windows\System32\vssadmin.exe, TOKEN_QUERY, TOKEN_READ) [c:\windows\system32\vssadmin.exe]
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_COMMIT MEM_RESERVE MEM_TOP_DOWN, PAGE_READWRITE, RegionSize=0x00010000) [c:\windows\system32\vssadmin.exe]
LoadLibrary(?????) [c:\windows\system32\vssadmin.exe]
GetModuleHandle(shell32.dll) [c:\windows\system32\vssadmin.exe]
QuerySystemInformation(SystemBasicInformation) [c:\windows\system32\vssadmin.exe]
지정된 시스템 정보 (첫번째 인자)를 가져오는 함수이다.
QuerySystemInformation Function 먼저 NtQuerySystemInfo 함수를 사용하여 모듈 갯수를 구한다. NtQuerySystemInformation 함수에 SystemModuleInformation 인자를 주어 호출하면 받아오는 데이터 구조는 아래와 같다. 모듈 개수 (4 bytes) + SystemModuleInformation 구조체 (284 bytes) + 모듈 개수 받아오는 데이터보다 버퍼가 작기 때문에 NTSTAUS의 에러코드인 STATUS_INFO_LENGTH_MISMATCH (버퍼 크기보다 큰 정보가 오면 리턴되는 값)을 리턴하는게 정상이다. 모듈 갯수를 가지고 저장할 버퍼의 크기를 정해, 모든 모듈의 정보를 받아와 출력한다. 저장할 버퍼의 크기를 모듈 갯수 말고도 4번째 인자인 ReturnLength로도 파악할 수 있다. NtQuerySystemInformation : 특정 프로세스에 관련된 다양한 정보를 반환한다. 이 함수는 때때로 CheckRemoteDebuggerPresent와 동일한 정보를 반환하기 때문에 안티디버깅 기법으로 사용하기도 한다. SystemInformation : 요청한 시스템 정보를 받아 저장할 버퍼의 포인터이다. SystemInformationClass 인자를 보고 시스템 정보의 크기와 구조체를 정한다. SystemInformationClass : 시스템 정보를 저장하는 인자이다. |
QuerySystemInformation(SystemProcessorInformation) [c:\windows\system32\vssadmin.exe]
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessImageInformation) [c:\windows\system32\vssadmin.exe]
SYSTEM_PROCESS_INFORMATION 구조체는 Windows NT 계열의 OS 시스템 콜 함수 (NT Native API)인 NtQuerySystemInformation 함수에서 사용하는 구조체 중 하나이다. 이 시스템 콜은 유저 모드 프로그램, 즉 일반적인 응용 프로그램에서는 ntdll.dll의 ZwQuerySystemInformation이라는 래퍼 함수 (Wrapper Function)을 호출함으로써 사용할 수 있다.
QueryProcessInformation Function SYSTEM_PROCESS_INFORMATION 구조체는 현재 시스템에 동작 중인 프로세스들의 정보를 얻을 때 사용한다. 보통은 Toolhelp API를 사용해서 CreateToolhelp32Snapshot 함수와 Process32First/Next 함수를 이용해서 순회하지만, 이 Toolhelp API는 내부적으로 이 NT Native API를 사용해서 구현되어 있으므로 시스템 콜을 직접 사용할 경우 처리 속도가 햐상되고 보다 자세한 정보를 얻을 수 있는 이점이 있다. typedef struct _SYSTEM_PROCESS_INFORMATION { ULONG NextEntryOffset; ULONG NumberOfThread; BYTE Reserved1[48]; PVOID Reserved2[3]; HANDLE UniqueProcessId; PVOID Reserved3; ULONG HandleCount; BYTE Reserved4[4]; PVOID Reserved5[11]; SIZE_T PeakPagefileUsage; SIZE_T PrivatePageCount; LARGE_INTEGER Reserved6[6]; } SYSTEM_PROCESS_INFORMATION; NtQueryInformationProcess Function 디버거 탐지에 사용되는 것은 ProcessDebugPort(0x7)과 ProcessDebugObjectHandle(0x1E) ProcessDebugFlags(0x1F)이다. NTSTATUS WINAPI NtQueryInformationProcess ( _In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength ); |
OpenProcess(C:\Windows\System32\vssadmin.exe, PROCESS_QUERY_INFORMATION) [c:\windows\system32\vssadmin.exe]
시스템 동작 중인 다른 프로세스 핸들을 오픈한다. 이 핸들은 다른 프로세스 메모리를 읽고 쓰거나 다른 프로세스로 코드를 주입할 때 사용한다. 프로세스를 다룰 때, 유저모드에서는 대부분 핸들로 다루고 커널모드에서는 Process Object (Executive Process : EPROCESS)로 다루나 여전히 핸들도 같이 쓰인다.
C:\\Windows\System32\vssadmin.exe : 해당 프로세스 핸들의 조작 권한을 얻음
PROCESS_QUERY_INFORMATION : 프로세스의 정보를 얻고자 할 때 설정
OpenProcess (
IN DWORD dwDesiredAccess, // 프로세스의 핸들을 얻을 때 설정할 권한
IN BOOL bInheritHandle, // 핸들을 상속할 지의 여부
IN DWORD dwProcessId // 프로세스를 열 때 필요한 프로세스 아이디 (PID, 프로세스 식별자)
);
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessCookie) [c:\windows\system32\vssadmin.exe]
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessSessionInformation) [c:\windows\system32\vssadmin.exe]
GetModuleHandle(advapi32.dll) [c:\windows\system32\vssadmin.exe]
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_COMMIT, PAGE_READWRITE, RegionSize=0x00002000) [c:\windows\system32\vssadmin.exe]
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessDefaultHardErrorMode) [c:\windows\system32\vssadmin.exe]
LoadLibrary(??????l) [c:\windows\system32\vssadmin.exe]
FreeLibrary(C:\Windows\System32\vssadmin.exe) [c:\windows\system32\vssadmin.exe]
QuerySystemInformation(123) [c:\windows\system32\vssadmin.exe]
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessQuotaLimits) [c:\windows\system32\vssadmin.exe]
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessVmCounters) [c:\windows\system32\vssadmin.exe]
ResumeThread(2920) [c:\windows\system32\vssadmin.exe]
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessWow64Information) [c:\windows\system32\vssadmin.exe]
OpenProcessToken(C:\Windows\System32\vssadmin.exe, TOKEN_ADJUST_PRIVILEGES, TOKEN_QUERY, TOKEN_READ, TOKEN_WRITE) [c:\windows\system32\vssadmin.exe]
AdjustTokenPrivileges(SeBackupPrivilege: EnabledByDefault Enable) [c:\windows\system32\vssadmin.exe]
토큰 권한을 적용, 명시된 Access Token의 권한을 Disable 또는 Enable 시킬 수 있는 API 함수이다. 특정 권한을 활성화하거나 비활성화 할 때 사용한다. 프로세스 인젝션을 행하는 악성코드는 종종 추가 권한을 얻기 위해 이 함수를 호출한다.
QueryProcessInformation(C:\Windows\System32\vssadmin.exe, ProcessBasicInformation) [c:\windows\system32\vssadmin.exe]
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_RESERVE, PAGE_READWRITE, RegionSize=0x00100000) [c:\windows\system32\vssadmin.exe]
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_COMMIT, PAGE_READWRITE, RegionSize=0x00002130) [c:\windows\system32\vssadmin.exe]
VirtualAllocEx(C:\Windows\System32\vssadmin.exe, MEM_RESERVE, PAGE_NOACCESS, RegionSize=0x00010000) [c:\windows\system32\vssadmin.exe]
QuerySystemInformation(SystemKernelDebuggerInformation) [c:\windows\system32\vssadmin.exe]
LoadLibrary(???????l) [c:\windows\system32\vssadmin.exe]
ResumeThread(3324) [c:\windows\system32\vssadmin.exe]
GetModuleHandle(ole32.dll) [c:\windows\system32\vssadmin.exe]
LdrFindEntryForAddress(0x752A0000) [c:\windows\system32\vssadmin.exe]
FreeLibrary(C:\Windows\System32\VssTrace.DLL) [c:\windows\system32\vssadmin.exe]
GetProcessDEPPolicy() [c:\windows\system32\vssadmin.exe]
프로세스의 DEP 설정을 검색한다.
Data Execution Prevention MS 윈도우의 메모리 보호 기술 (Memory Protection Technology) 중에 하나인 데이터 실행 방지 (DEP/NX; Data Execution Prevention/No eXecute)라는 기술이다. MS 윈도우를 대상으로 하는 많은 유해 코드가 데이터와 코드가 같은 메모리 상에 존재하며 접근 가능한 폰 노이만 구조의 특징을 이용하여 버퍼 오버런 (Buffer Overrun)을 유발시킨 후 이 과정을 통해서 주입된 임의의 데이터 코드를 실행시키고자 시도하는 것을 방지하는 기술이다. |
LdrFindEntryForAddress(0x719A0000) [c:\windows\system32\vssadmin.exe]
Sleep(0) [c:\windows\system32\vssadmin.exe]
Sleep(60000) [c:\windows\system32\vssadmin.exe]
ExitProcess(2) [c:\windows\system32\vssadmin.exe]
자기 자신을 종료시킨다.
ExitProcess (IN DWORD ExitCode);
- ExitCode : 자기 자신 종료시에 Set 할 코드
- 반환 값은 없다.
FreeLibrary(C:\Windows\System32\PROPSYS.dll) [c:\windows\system32\vssadmin.exe]
FreeLibrary(C:\Windows\system32\IMM32.DLL) [c:\windows\system32\vssadmin.exe]
TerminateProcess() [c:\windows\system32\vssadmin.exe]
프로세스를 종료한다.
TerminateProcess (
IN HANDLE hProcess, // 프로세스의 핸들
IN DWORD dwExitCode // 프로세스 종료 시에 Set 할 종료 코드
);
'Study > 랜섬웨어' 카테고리의 다른 글
랜섬웨어 샘플 분석 (5) Buster Sandbox Analyzer : RegDiff (0) | 2016.07.06 |
---|---|
랜섬웨어 샘플 분석 (3) Buster Sandbox Analyzer : FileDiff (0) | 2016.07.05 |
랜섬웨어 샘플 분석 (2) Buster Sandbox Analyzer : Connections (0) | 2016.07.05 |
랜섬웨어 샘플 분석 (1) Buster Sandbox Analyzer : Analysis (0) | 2016.07.05 |
랜섬웨어의 종류 (0) | 2016.06.27 |
댓글