본 내용은 파이썬 오픈소스 도구를 활용한 악성코드 분석 책을 참고하였음을 알립니다.
PE파일 포맷(Portable Executable File Format)
: 파일이 이식 가능한 곳에도 실행 가능하도록 만든 포맷
1 . 윈도우에서 동작할수 있게하는 실행 파일, DLL 파일 등을 위한 파일 형식
2. 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체
3. Linking을 위한 동적 라이브러리 참조, API Export와 Import Table, 자원 관리 데이터 그리고 TLS 데이터를 포함
PE 파일 분석에 사용할 도구 : peframe.py , PEView, HxD
IAT (Import Address Table) : 함수의 위치를 알려줌
IMAGE_DOS_HEADER
: PE 가장 첫 번째 값으로 MZ(마크 츠비코프스키) 헤더를 통해 MS-DOS 헤더의 시작을 알림 (IMAGE_NT_HEADER의 구조체 위치를 알림)
IMAGE_NT_HEADER
1. Signature
2. IMAGE_FILE_HEADER
(1) Machine : 어떤 CPU에서 실행 가능한지 알림
(2) NumberOfSections(4) : 이 파일이 가진 세션의 개수를 알림(.text, .rdata, .data, .rsrc)
(3) TimeDateStamp : EXE 파일을 만든 시간(Linking된 시간)
(4) SizeOfOptionalHeader : IMAGE_OPTIONAL_HEADER32의 구조체 크기를 알림
(5) Characteristics : 이 파일이 어떤 형식인지 알림
3. IMAGE_OPTIONAL_HEADER (Standard Fields)
(1) Magic : 비트를 체크
32bit -> 0x10B
64bit -> 0x20B
(2) MajorLinkerVersion, MinorLinkerVersion : 사용한 컴파일러 버전
(3) SizeOfCode : 코드 양의 전체 크기
악성코드 : 이 값을 참고하여 자신의 코드를 복제할 위치 기준을 잡음
보안 솔루션 : 코드 섹션의 무결성 검사
(4) AddressOfEntryPoint : 파일이 메모리에서 시작되는 지점
(5) BaseOfCode : 실행 코드 위치 - ImageBase와 BaseOfCode를 더한 값부터 코드 시작
(6) ImageBase : 로드할 가상 메모리 주소 (00400000)
(7) SectionAlignment, FileAlignment : 각 세션을 정렬하기 위한 정렬 단위
(8) SizeOfImage : EXE/DLL이 메모리에 로딩했을 때 전체크기
(9) SizeOfHeaders : PE 헤더의 크기를 알림
(10) IMAGE_DATA_DIRECTORY : VirtualAddress와 Size 필드, IAT 등의 정보를 담고 있음
(11) Subsystem : 동작 종류
섹션(Sections) : PE 파일에서 섹션은 프로그램의 실제 내용을 담고 있는 블록
.txt (code section) : 프로그램을 실행하기 위한 코드를 담는 섹션
(1) IMPORT Address Table (IAT) : 로드된 실제 함수 주소 목록 [구성]
(2) IMPORT Name Table (INT) : 임포트 함수 이름 주소 목록 [구성요소1]
(3) IMPORT Hints/Names & DLL Names : 로드하는 임포트 함수 이름 목록 [구성요소2]
.data (data section) : 초기화된 전역 변수들을 담고 있는 읽고 쓰기가 가능한 섹션
.rdata (data section) : 가상 함수 테이블 배치 및 읽기 전용 데이터를 이 섹션에 병합
.reloc (relocation section) : 실행 파일에 대한 기준 재배치 정보를 담고 있는 섹션
.rsrc (resoruce section) : 대화상자, 아이콘, 커서 등 윈도우 PE 파일을 담음
.edata (export section) : 내보낼 함수에 대한 정보를 담음 (.rdata에 병합)
.idata (import section): 가져올 dll과 함수 및 변수에 대한 정보를 담음 , IAT이 존재 (.rdata에 병합)
.tls (TLS section) : 스레드(thread) 지역 저장소를 위한 섹션
IMAGE_Section_Header : 각 센션에 대한 이름, 시작 주소, 사이즈 등의 정보를 관리하는 구조체