1. PE파일
종류 |
설명 |
EXE |
실행 파일 |
SCR |
실행 파일(화면보호기) |
DLL |
라이브러리 |
OCX |
라이브러리(ActiveX) |
SYS |
시스템 드라이버 |
OBJ |
오브젝트 파일 |
- PE 파일은 파일에 존재할 때의 구조와 메모리에 로드된 후의 모습이 달라진다.
- 파일에서는 첫 바이트부터의 거리를 뜻하는 offset을 사용하고, 메모리에서는 VA(Virual Address, 가상주소)와 RVA(Relative Virtual Address, 상대적 가상주소)를 사용
- PE 파일이 메모리에 로드될 때 한 주소에 고정적으로 로딩되는 것이 아니기 때문에 상대주소 사용
* Alignment = 여러 내부 연산 등 처리상의 효율성을 위해 특정 단위로 간격을 맞춰주는 것
- Section Alignment 값이 File Alignment 값보다 커서 메모리에 로드된 PE 파일의 사이즈가 파일 형태일 때보다 크다.
- PE에서 남는 공간은 널바이트로 채워줌.
1) Image_DOS_Header와 DOS Stub
= PE포맷의 시작 부분에 위치한 40바이트의 구조체
= Windows가 아닌 DOS운영체제를 위한 것(DOS에서 PE파일이 실행되는 경우를 위해 만들어진 것)
* e_magic
= PE파일임을 나타내주는 첫 2개의 바이트
= MZ(5A4D)로 고정 (MZ가 아니면 PE파일로 인식 X)
* e_lfanew
= NT Header가 시작되는 위치의 offset을 나타냄
* DOS Stub
= DOS용 실행 코드 (DOS가 아니면 실행조차 되지 않음)
2) Image_NT_Headers
= NT헤더임을 나타내는 시그니처인 "P E 0 0" 4바이트로 시작
= FileHeader와 OptionalHeader를 멤버로 가지는 구조체
* FileHeader
- Machine : 이 파일의 실행 대상 플랫폼(상수값으로 나타냄)
ex) Intel386 = 0x014c // Intel64 = 0x0200 // ARM = 0x01c0
- NumberOfSetions : 파일에 존재하는 섹션의 수(파일에 따라 섹션의 갯수는 달라질 수 있음)
- SizeOfOptionalHeader : 바로 이어지는 Optional Header의 크기를 알려줌
- Characteristics : PE 파일의 특성을 알려줌 -> 이를 통해 DLL인지, 실행파일인지 알 수 있음 (마지막 멤버, 최종 값은 해당되는 속성들의 OR 값으로 표시)
ex) IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002 // IMAGE_FILE_32BIT_MACHINE = 0x0100 // IMAGE_FILE_DLL = 0x2000
* Image_Optional_Header
- Magic : Image_Optional_Header32인지 64인지 구분 (32 = 0x10B / 64=0x20B)
- Address of EntryPoint : 파일이 메모리에 매핑된 후 코드 시작 주소를 나타냄 (PE 로더는 ImageBase 값에 이 값을 더해 코드 시작 지점으로 설정)
- SectionAlignment, FileAlignment : 각각 메모리와 파일 상태에서의 정렬값 (각 섹션은 반드시 Alignment의 배수여야 한다)
- Subsystem : 동작환경 정의
ex) 시스템 드라이버 파일인 sys = 0x1
GUI프로그램 = 0x2
CLI 프로그램 = 0x3
- DataDirectory : NumberOfRvaAndSizes를 통해 디렉토리 수를 정해줄 수 있으나 일반적으로 정형화된 16개의 디렉토리를 가짐.
- Export Directory : DLL 등의 파일에서 외부에 함수를 공개하기 위한 정보들을 가짐
- Import Directory : 프로그램 실행을 위해 Import하는 DLL 이름과 사용할 함수정보가 담긴 INT(Import Name Table), IAT(Import Address Table)주소 등의 정보가 들어있음.
* Characteristics = 각 섹션의 특징을 알려줌
ex) IMAGE_SCN_CNT_CODE = 0x00000020 // 섹션이 코드를 포함
IMAGE_SCN_MEM_EXECUTE = 0x20000000 // 섹션 실행 권한 존재
IMAGE_SCN_MEM_READ = 0x40000000 // 섹션 읽기 권한 존재
IMAGE_SCN_MEM_WRITE = 0x80000000 // 섹션 쓰기 권한 존재
'Hacking > System' 카테고리의 다른 글
PART3 쉘코드 원리와 작성(2) (1) | 2016.12.27 |
---|---|
PART3 쉘코드 원리와 작성 (0) | 2016.12.21 |
16.12.19 공부일지 (0) | 2016.12.20 |