본문으로 바로가기

포렌식 기초 정리

category Forensics/정리자료 2017. 6. 12. 19:26

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