1. PE 파일 정의
- 윈도우에서 실행 파일이란 PE 파일 포맷을 가지고 있는 파일들을 말한다.
- 확장자
실행 계열: EXE, SCR
드라이버 계열: SYS, VXD
라이브러리 계열: DLL, OCX, CPL, DRV
오브젝트 파일 계열: OBJ
- 구성
HEADER + SECTION
Header : 실행 파일의 성격과 특징
Section: 구체적이고 세부적인 기능
2. PE 파일 구조
- DOS Header
e_magic field : 4D 5A -> MZ
e_lfanew filed : NT header의 offset(가변적)
- DOS Stub
에러 메시지 출력
크기가 일정하지 않음
- NT Header
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADER32, *PIMAGE_NT_HEADERS32;
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections; // 섹션의 개수, 반드시 0보다 커야함, 정의된 섹션 부 보다 실제 섹션이 적다면 실행 에러 발생
// 정의된 섹션 수 보다 실제 섹션이 많다면 정의된 개수만큼만 인식
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; // 옵션 헤더의 크기를 의미, 실행 파일에만 필요하며 오브젝트 파일에서는 필요가 없다.
WORD Characteristics; // 파일의 속성을 나타낸다. 실행 가능한 형태 유무
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
typedef struct _IMAGE_OPTIONAL_HEADER { // PE header 구조체 중 크기가 가장 큼,
// 이 값들은 필수적인 값으로 잘못 세팅되면 파일은 정상적으로 실행되지 않음
WORD Magic; // 32bit -> 10Bh, 64bit -> 20Bh
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint; // EP의 RVA 값을 가진다. 실제 EP는 AddressOfEntryPoint + ImageBase
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase; // 로딩(매핑)되는 시작 주소를 나타낸다.
DWORD SectionAlignment; // 메모리에서 섹션의 최소 단위
DWORD FileAlignment; // 파일에서 섹션의 최소 단위, 최소 단위를 맞추기 위해 PE 구조에서 각 section들이 끝나면 NULL padding 기술 사용
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage; // PE 파일 메모리 로딩 시 가상 메모리에서 PE Image가 차지하는 크기
DWORD SizeOfHeaders; // PE header 전체 크기
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes; // 마지막 멤버인 DataDirectory 배열의 크기
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // IMAGE_DATA_DIRECTORY 구조체의 배열
} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
- Section Header
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize; // 메모리에서 섹션이 차지하는 크기
} Misc;
DWORD VirtualAddress; // 메모리에서 섹션의 시작 주소(RVA),
// IMAGE_OPTIONAL_HEADER32에서 정의된 SectionAlignment와 FileAlignment에 맞게 결정
DWORD SizeOfRawData; // 파일에서 섹션이 차지하는 크기
DWORD PointerToRawData; // 파일에서 섹션의 시작 위치
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics; // 섹션의 특징(bit OR)
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
RVA(Relative Virtual Address) to RAW(offset)
RAW - PointerToRawData = RVA - VirtualAddress
RAW = RVA - VirtualAddress + PointerToRawData
RAW = 파일에서의 주소
RVA = 메모리에서의 주소
VirtualAddress = 메모리에서의 섹션 시작 위치
PointerToRawData = 파일에서의 섹션 시작 위치
Q. RVA = 12301h 일 때, File Offset은?
A: 12301은 Section(".rsrc") 영역에 속한다. 그러므로 VirtualAddress는 100B000h, PointerToRawData는 8400h
RAW = RVA(12301h) - VirtualAddress(B000h) + PointerToRawData(8400h)
= F701h
- Section
- padding
3. 기초 악성코드 분석
정적 분석:
- 악성코드 분석 시 먼저 정적 분석부터 진행
- 프로그램의 기능 파악을 위해 코드나 프로그램의 구조를 분석
- 프로그램 자체를 실행하지는 않음
문자열 검색, 패커 탐지, 링크 라이브러리와 함수 확인, PE 파일 점검
동적 분석:
- 실행하여 변화추이 모니터링
4. 레지스트리 정의
윈도우 레지스트리
- 운영체제와 응용프로그램 운영에 필요한 정보를 저장하기 위한 계층형 데이터베이스
- 부팅 과정부터 로그인, 서비스 실행, 응용프로그램 실행, 사용자 행위 등 모든 활동에 관여
레지스트리 분석의 필요성
- 운영체제 정보, 사용자 계정 정보, 시스템 정보, 응용프로그램 실행 흔적, 최근 접근 문서 등
- 자동 실행 항목 분석, 악성코드 탐지
- 저장매체 사용 흔적 분석
레지스트리를 통해 알 수 있는 정보
- 컴퓨터 정보
- 최근에 열었거나, 실행, 수정한 문서에 대한 사용 흔적
- 서버의 경우 불법계정생성 유무 확인
- 특정 프로그램 설치 및 삭제 흔적
- 악성 프로그램 감염 여부
루트키들은 하이브(hive)라 불리는 작은 레지스트리 데이터 구조체들의 집합이거나 다른 루트키의 일부(서브셋)에 지나지 않는다.
루트키 |
약자 |
설명 |
HKEY_CLASSES_ROOT |
HKCR |
HKLM\SOFTWARE\Classes와 HKU\<SID>\Classes 모음 파일 확장자에 대한 가상 레지스트리 값을 저장 |
HKEY_CURRENT_USER |
HKCU |
HKU 아래의 유저들 중에서 현재 로그온한 유저에 해당하는 서브키들 |
HKEY_LOCAL_MACHINE |
HKLM |
시스템에 있는 하드웨어, 소프트웨어 정보를 저장 |
HKEY_USERS |
HKU |
시스템에 있는 모든 계정과 그룹에 관한 정보를 저장 |
HKEY_CURRENT_CONFIG |
HKCC |
시스템이 시작할 때 사용하는 하드웨어 프로파일 정보를 저장 |
※ 온전히 자신만의 하이브를 가지고 있는 것은 HKLM과 HKU 뿐이며, 나머지 루트키들은 이 두 루트키의 서브셋이다.
5. 하이브(hive) 구조
하이브 파일
- 레지스트리의 정보를 갖고 있는 디스크 상의 파일
- 레지스트리 정보를 저장하고 있는 물리적인 파일
- 키 값들이 논리적인 구조로 저장
- 자신만의 하이브를 가지고 있는 것은 HKLM과 HKU
- 나머지 루트키들은 이 두 루트키의 서브셋
하이브 구조
- 하이브에서 사용하는 논리적인 할당 단위
- 블록 크기 : 4,096 바이트
- 새로운 데이터 추가 시 블록 단위로 증가
- Hive Bin
셀을 포함한 컨테이너
가변 길이의 블록
hbin으로 시작
레지스트리 로드 시 하이브 빈 단위를 기준으로 로드
- 셀
- 하이브 내의 다양한 데이터는 셀 구조로 저장(8바이트의 배수)
- 메모리 내의 불연속적인 하이브 데이터를 참조하기 위해 Cell Map 이용
[그림] Hive Header
[그림] Hive Bin Header
[그림] Hive Bin
6. 응용프로그램 사용 로그
키: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count
이름: 다양(ROT-13)
타입: REG_BINARY
UserAssist키는 그 아래에 GUID로 된 최소 2개 이상의 서브키를 갖는다. 다시 이 서브키 아래에는 'count'라는 서브키가 있고, 이 서브키 안에서 ROT-13으로 인코딩 된 수많은 값을 볼 수 있다.
ROT13
A~M 값들과 N~Z 값들이 1:1 매칭 되어 변환 되는 암호화 방법
7. 레지스트리 보안
레지스트리 설정
- 키 권한 설정(HKLM\SECURITY)
악성코드(자동 시작 목록)
- AppInit_DLLs: GUI 응용프로그램에 의해 로드되는 DLL
HKLM\SOFRWARE\Microsoft\Windows NT\CurrentVersion\Windows
일반적으로 비어있으며, 값이 존재한다면 악성코드일 가능성
- HKLM\SOFTWARE\Microsoft\Command Processor
명령프롬프트 실행 시 자동 시작되는 응용 프로그램
AutoRun: 값 생성 후 특정 응용프로그램을 지정하면 명령 프롬프트 실행 시 함께 실행
Ref. 윈도우 포렌식 실전 가이드_고원봉
'Forensics > 정리자료' 카테고리의 다른 글
RVA를 RAW로 변환하기(Rva to Raw) (0) | 2017.06.12 |
---|---|
DKOM_2017_04_17 (0) | 2017.04.17 |
EPROCESS_2017_04_17 (0) | 2017.04.17 |
핸들과 DLL_2017_04_17 (0) | 2017.04.17 |
Live Response 명령어 (0) | 2017.04.17 |