PE(Portable Executable) 파일 포맷에 대해 알아보자.
이전에 포스팅했던 리눅스 시스템의 ELF 파일 포맷과 일맥상통하는
윈도우 시스템의 파일 포맷이다.
리버스 엔지니어링에는 PE파일 포맷 공부가 필수적이라 말할 수 있음.
Unix 운영체제의 COFF file format 에서 나온 변종이라고 할 수 있다.
PE 파일 포맷에 대해 완벽하게 파고드려면 한도 끝도 없으니
리버싱에 꼭! 필요한 부분을 집중적으로 설명하도록 하겠음.
먼저 PE 파일 포맷의 레이아웃부터 살펴보자.
그림 1은 PE파일 포맷의 기본 레이아웃과 PE View 라는 툴로 임의의 exe파일을 열어 네비게이터를
캡쳐한 화면이다. PE 포맷의 프로그램이 파일자체로 어떤 구조를 가지고 있는지 알 수 있다.
PE는 이 파일자체로의 모습도 중요하지만 메모리상에 프로그램으로 올라갔을 때 즉,
프로세스로 등록되어 있을 때 상황도 생각해야 한다.
(이건 나중에 OPTIONAL_HEADER 설명에서 자세히 하겠음)
일단 기본적인 헤더의 내용들을 알아보겠다.
1. DOS Header, DOS Stub code
DOS헤더와 Stub code는 간단하게 말해서 PE파일인지 아닌지 확인하고
도스파일 이라면 실행할 수 없다는 메세지를 띄워주는 것이다.
PE분석할 때 눈여겨 볼 부분은 아니지만 이 코드를 시작으로 PE 포맷이 시작된다는 걸 알아야 한다.
그림 2를 보면 dos 헤더와 stub code 헥사값을 알 수 있다.
MZ로 시작하는데 MZ는 DOS를 설계한 Mark Zbikowski 라는 사람 이름 약자라고 함.
PE는 32bit Windows환경의 파일 포맷이므로
16bit DOS에선 실행 안되는 것이 당연하다.
그래서 PE파일인지 확인하는 부분이다.
위에서도 말했지만 MZ가 PE파일의 시작이라고 했다.
이게 중요하다. 그리고 만약 PE파일이라면
구조체에 저장되어진 NT Header가 위치한 주소로 이동할 수 있도록 한다.
dos header 크기는 64byte(0x40) 이다.
만약 16bit MS-DOS 환경이라면 아래 Stub code가 실행되어
"This program cannot be run in DOS mode" 라는 문자열을 띄우는
프로그램이 실행될 것이다.
2. NT Header
이제 본격적으로 NT헤더 즉, PE헤더에 대해 알아보자.
NT Header는 Signature, IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER
3가지 구조로 구성된다.
그럼 구조별로 하나하나 알아보자.
2-1. Signature
elf와 마찬가지로 PE구조도 "내가 PE파일이다" 라고 말하는 부분이 있어야겠지??
그게 바로 Signature다. 0x45500000 4바이트 할당되어 있다.
따로 설명할 필요는 없을 듯 하다.
그냥 PE라고 되어 있으면 PE 파일이다.
2-2. IMAGE_FILE_HEADER
여기에는 기본적인 PE파일에 대한 정보들이 들어 있다.
File header의 기본적인 구조체 원형을 보자.
솔직히 FILE_HEADER에 있는 값들은 리버싱할 때 거의 참고 하지 않는다.
조작 가능한 값들이 많고, 실제 분석시에 그다지 도움 될만한 부분이 없음
간단하게 표로 주요 필드를 정리하고 넘어감.
2-3. IMAGE_OPTIONAL_HEADER
제일 중요한 OPTIONAL_HEADER가 등장했다. 여기에선 설명할 부분이 좀 많다.
먼저 구조체 원형을 보겠다.
필드 설명부터 들어가겠음.
비교적 중요도가 높은 필드만 설명하겠습니다~
일단 PE view 라는 툴을 사용해 예제 파일의 optional header 구조를 뒤져보겠음
위에서 부터 순서대로 헤더 필드값들이 어디 위치하고
무슨 값을 갖는지 확인해보겠음.
a. Magic 필드
32비트, 64비트 파일인지 알 수 있게 해주는 부분이다.
32비트는 0x010B, 64비트인 경우 0x020B 이다.
b. SizeOfCode 필드
여기엔 .text 섹션의 코드 길이값이 적혀있다.
PEid를 이용해 재확인 해 보겠음.
c. ImageBase 필드
순서상으론 AddressOfEntryPoint BaseOfCode 를 먼저 해야하지만,
이 값과 연관된 개념을 알아야 하므로 먼저 적음.
ImageBase를 설명하기 이전에 알아야 할 개념이 있다.
파일 상태일 때의 PE와 메모리 상에 올라갔을 때의 PE이다.
파일 상태는 말 그대로 하드디스크 상에 파일 일 때의 PE 파일의 형태.
메모리 상에 올라왔을 때는 말그대로 메모리에 로딩되어 있는 상태를 얘기한다.
메모리 상에 로드 되었을 때의 절대주소를 VA(Virtual Address) 라고 한다.
그리고 어떠한 기준으로 부터의 상대주소를 RVA(Relative Virtual Address)라고 한다.
그 어떠한 기준이 바로 ImageBase 값이다.
ImageBase 값은 메모리 상에 올라갔을 때 어디서 부터 시작하냐?
즉, PE파일이 메모리에 로드될 때 시작주소를 가르킨다.
고로 VA = RVA + ImageBase 이다.
(대개 imagebase 값은 0x00400000)
근데 굳이 왜 이렇게 상대주소(RVA)와 절대주소(VA)로 나누어 놓은 것일까?
PE파일을 메모리 상에 로드 시켰는데, 로드 시킨 자리에 다른 PE파일 내용이 로드 되어 있다면??
다른 위치로 재배치를 해야 할 것인데.. 이미지베이스와 RVA 값으로 나눠놓지 않는다면 배치가 엉망이 되지 않을까?
그래서 RVA값과 ImageBase값으로 배치를 한다면, 메모리상에서 재배치 작업이 이루어져도
올바르게 로딩될 수 있을 것이다
d. AddressOfEntryPoint 필드
엔트리 포인트의 주소가 RVA로 저장되어 있는 필드이다.
프로그램이 시작되는 위치가 엔트리 포인트이다.
(디버거로 프로그램을 열면 브레이크 포인트가 걸리는 가장 처음 위치)
e. BaseOfCode 필드
코드영역이 시작하는 부분의 RVA가 저장되어 있는 필드이다.
PE헤더의 필드들 중 주소를 가르키는 값들은 웬만하면 다 RVA값이 들어있음.
f. SectionAlignment, FileAlignment 필드
파일 상의 섹션 최소 단위를 FileAlignment
메모리 상의 섹션 최소 단위를 SectionAlignment 라고 한다.
파일, 메모리상의 섹션 크기는 무조건 이 필드 값들의 배수가 되어야 한다.
이말이 무슨말 인가하면,
위 그림 처럼 FileAlignment 값이 0x1000 이고, 해당 섹션의 데이터 크기가 0x1400 이라면
나머지 0x600 크기 만큼 null (padding 이라고한다)이 채워지고 크기는 0x1000의 배수인
0x2000 이 된다는 말이다.
효율적인 데이터 처리를 위해 최소 기본 단위 개념을 사용하는 것이다.
대개 이 두가지 필드는 같은 값을 지닌다. 그 말인 즉, 파일 상일 때나 메모리에 올라와 있을 때나
생겨먹은 레이아웃은 똑같다 이말이다.
g. SizeOfImage, SizeOfHeader 필드
SizeOfImage는 PE파일이 메모리에 올라올 때 필요한 파일의 전체 크기를 나타내는 것.
SizeOfHeader는 PE파일 헤더의 전체 크기를 나타낸다.
이또한 널 패딩이 들어가므로 FileAlignment의 배수값을 가진다.
h. SubSystem 필드
파일의 서브시스템을 구분지어주는 필드이다. 이게 어떤 파일인지 구분짓는 것.
서브시스템에 대한 설명을 따로 포스팅 해두었다, http://s2kiess.blog.me/30180213664
i. DataDirectory 필드
데이터 디렉토리는 프로그램에 대한 갖가지 정보들이 테이블로 정렬되어 있는것이다.
IMAGE_DATA_DIRECTORY 구조체에 선언된 구조체 배열로 생각하면 된다.
각 배열 항목마다 RVA 값과 사이즈가 정의되어 있다.
총 16개의 배열로 되어 있다.
위의 그림엔 마지막 배열이 짤렸지만(어차피 예약 테이블이라 비어있음) 16개가 맞다.
가장 위에 Number of Data Directories 에 값이 0x10으로 되어 있음.
일단 IMAGE_OPTIONAL_HEADER 까지 해서 NT Header에 대한 설명은 끝났다.
이어지는 포스팅에서 나머지 IMAGE_SECTION_HEADER를 자세히 알아보도록 하겠음
* 참고자료 및 URL
http://en.wikipedia.org/wiki/Mark_Zbikowski
http://haerakai.tistory.com/18
리버싱 핵심 원리 (저자: 이승원)
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
윈도우 서버 파일 백업 (0) | 2021.04.18 |
---|---|
PE File Format - 2 (0) | 2021.04.18 |
DLL (Dynamic Link Library) (0) | 2021.04.18 |
윈도우 XP 은폐 계정 생성 (0) | 2021.04.18 |
윈도우 계정 및 패스워드 관리 (0) | 2021.04.18 |