학사 나부랭이
Reversing - Portable Executable - Opening 본문
Portable Executable
PE는 윈도우에서 정의한 파일 포맷으로 직간접적으로 실행하는 파일이에요.
실행 파일 | exe, scr |
오브젝트 파일 | obj |
라이브러리 파일 | dll, ocx |
드라이버 파일 | sys |
이 중 obj 파일을 제외하고는 직간접적으로 실행 가능한 파일이에요. 예를 들어 dll과 sys 파일 등은 shell에서 직접 실행할 수는 없지만 디버거, 서비스 등을 이용해 실행가능하죠.
위 사진은 어떤 실행 파일(exe)의 시작 부분이자 PE 파일의 헤더 부분이에요. 여기에 어떻게 메모리에 적재될 것이며 어디서 시작할 건지, 실행할 때 필요한 DLL 등 asdf.exe가 실행되기 위한 모든 정보들이 구조체 형식으로 저장되어 있죠.
기본 구조
헤더에는 파일 실행을 위한 기본 정보, 메모리 상대 위치 등 중요 정보가 있고 바디에는 코드와 데이터가 저장되어있어요.
사진처럼 파일이 메모리에 메모리에 적재되면 섹션의 크기, 위치같은 모양이 달라지므로 파일에서는 오프셋으로, 메모리에서(프로세스)는 VA로 위치를 표현해요.
파일의 내용은 보통 코드(.text), 데이터(.data), 리소스(.rsrc) 섹션에 나뉘어 저장되어요. 개발도구나 빌드 옵션에 따라 섹션의 이름, 크기, 개수가 다른데 어쨌든 섹션이 나뉘어 저장된다는 것이 중요해요.
섹션 헤더에 각 섹션에 대한 파일/메모리에서의 크기, 위치, 속성 등이 정의되어 있어요.
PE 헤더와 각 섹션의 끝에는 NULL 패딩이 존재하는데, 이 패딩은 컴퓨터가 파일, 메모리, 패킷 등 데이터를 처리할 때 효율을 높이기 위해 최소 기본 단위를 사용하는데, 넣을 데이터의 양이 이 단위의 크기에 못 미칠 경우 질소 포장처럼 임시적으로 채워주는 역할을 해요.
파일/메모리에서 섹션의 시작 위치는 각 파일/메모리의 최소 기본 단위의 배수에 해당하는 위치에 두고, 빈 공간을 NULL로 채워요.
오프셋, VA, RVA
오프셋은 파일의 첫 바이트부터의 거리이고, Virtual Address는 프로세스의, 가상의 메모리에서 절대 주소이며, Relative-Virtual Address는 기저위치(ImageBase)에서부터의 상대적인 주소예요. 즉, RVA = VA + ImageBase이죠.
PE 헤더에는 RVA 형태로 된 것이 많은데, PE 파일이(주로 DLL) 프로세스 가상 메모리의 특정 위치에 로딩되려 할 때, 이미 다른 PE 파일이 로딩되어 있을 수 있는데 그렇다면 재배치를 해서 다른 위치에 로딩되어야 하는데 VA로 되어있다면, 정상적인 값에 접근하지 않겠죠?
'Dot-Gabi > Reversing' 카테고리의 다른 글
The basic of Assembly language & Debugger (0) | 2021.07.08 |
---|---|
Reversing - Portable Executable - PE header - Section header (0) | 2021.06.04 |
Reversing - Portable Executable - PE header - NT header (0) | 2021.06.01 |
Reversing - Portable Executable - PE header - DOS header, stub (0) | 2021.06.01 |
Reversing - Register, Stack Frame (0) | 2021.05.30 |