[모각코] 1주차 보고서(PE파일 구조)

semon·2023년 1월 6일
0

22-23_동계 모각코

목록 보기
2/7

1. PE파일이란?

  • PE란 portable executable의 약자로 이 PE 포맷으로 구성된 PE 파일들은 윈도우 운영체제가 돌아가는 시스템이면 어디서든 실행 가능하다.
  • 대표적으로는 .exe 확장자를 가지는 exe파일이 있으며 이외에도 다양한 종류가 있다.

1-1. 이미지 개념

이미지(image)

  • PE 파일이나 실행 파일들과 같은 말에서 공통으로 들어가는 파일이란 단어는 WinNT.h 헤더에서 파일이 아닌 이미지(image)를 뜻하며 이때의 이미지는 JPEG, BMP와 달리 단어 어원적인 의미이다.
  • 일반 데이터 파일이 메모리에 로드될 때 VMM(virtual memory manager)이 페이지 파일이라는 영역을 하드 디스크에 유지하여 이 페이지 파일과 스와핑, 매핑을 적절히하여 마치 프로세스에 32비트 또는 64비트에 해당하는 가상 공간이 할당된 것처럼 프로세스를 속인다.
  • 하지만 PE파일은 VMM을 사용하지 않고 PE 파일 자체를 페이지 파일처럼 가상 주소 공간에 매핑한다. 이때 이미지 라는 것이 메모리에 매핑된 하드디스트의 PE 파일의 이미지이다. 즉, 가상 주소 공간에 로드된 PE 포맷이 하드디스트에 존재하는 PE 포맷의 이미지이다. 이때의 포맷은 거의 같다고 볼 수 있다.

2. PE파일의 종류

  • 실행 계열 : .exe, .scr
  • 드라이버 계열 : .sys, .vxd
  • 라이브러리 계열 : dll, .ocx, .cpl, .drv
  • 오브젝트 계열 : .obj

3. PE파일 구조

1. RVA와 섹션(section)
- RVA(상대적 가상 주소 - Relative Virtual Address)란 PE 파일의 이미지가 메모리에 로드 되었을 때 즉, 가상 주소 공간에 로드 되었을 때 그 시작 주소에 대한 상대적인 주소 번지를 가르킨다. 이는 파일 오프셋과는 관점이 다르다.
- 32비트 환경에서는 가상 메모리에 로드되는 위치를 exe는 0x00400000, dll은 0x00100000에 위치 시켰지만 보안상의 문제로 64비트 환경에서는 위치가 특정 지어지지 않는다. 그렇기에 RVA를 가상 주소 공간의 실제 번지로 변환하는 방식은 다음과 같다

	VA(Virtual Address) = 이미지 로드 시작번지(ImageBase) - RVA

- 섹션(Section)이란 프로그램의 실제 내용을 담고 있는 block으로 이 섹션 내용이 참조되고 실행 된다. 코드섹션(.text), 데이터 섹션(.data), 읽기 전용 데이터 섹션(.rdata), 기준 재배치 섹션(.reloc) 등이 있다.

  • 코드섹션(.text)
    - 프로그램을 실행시키기 위한 코드를 담고 있는 섹션이다. IP 레지스터(CPU의 명령 포인터)는 이 섹션내에 존재하는 번지를 담는다. 즉, 코드섹션에 존재하는 내용이 우리가 리버스 엔지니어링을 할 때 보는 어셈 코드이고 그 주소가 속한 섹션이 코드 섹션이다.
  • 데이터섹션(.data)
    - 초기화된 전역변수를 담고 있는 섹션으로 읽기 및 쓰기 권한이 있다. 이전에는 초기화되지 않은 데이터를 위한 데이터 섹션으로 .bss를 사용하였다. 32비트에서는 PE파일에 존재 할 수 있지만 가상 주소 공간에 매핑 될 때 보통 .data 섹션에 병합되어 메모리에서 볼 수 없다. 64비트에서는 PE파일 자체에서 .bss를 .data와 병합하여 PE파일에서도 존재하지 않는다.
  • **읽기전용데이터섹션(.rdata)
    - 읽기전용 데이터섹션이다. 문자열 상수나 c++ 가상함수 테이블 등이 속해있다. 내보내기섹션(.edata)이나 디버그 섹션(.debug) 등이 .rdata 섹션에 병합되어있다. 또한 조건에 따라 가져오기섹션(.idata), 지연로드섹션(.didata) 등이 이 섹션에 병합된다. 또 데이터 디렉터리의 여러 엔트리 또한 포함된다.
  • **기준재배치섹션(.reloc)
    - 실행 파일에 대한 기준 재배치 정보를 담고 있는 섹션이다. 기준 재배치란 주소를 갱신 하는 것으로 PE 이미지를 원하는 기본 주소에 로드하지 못하고 다른 주소에 로드했거나 코드 상에서 가상주소를 참조하는 예를 들어 포인터 연산과 같은 경우 기준 재배치가 필요하다.

2. IMAGE_DOS_HEADER
- IMAGE_XXX_XXX 형태의 명칭들은 WinNT.h 헤더에 정의된 구조체들이다. IMAGE_DOS_HEADER는 MZ으로 시작하며 도스와의 호환을 위한 코드인 도스 스텁을 담고 있고 이 이후부터 실제 PE 포맷이 시작된다.

3. IMAGE_NT_HEADER

- 실제 PE 포맷의 시작으로 IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER 구조체로 구성 되어있다.

  • IMAGE_FILE_HEADER

    - IMAGE_FILE_HEADER는 PE 파일의 파일 정보를 나타낸다. CPU별 고유값, 섹션의 개수, 빌드 된 시간, Optional_Header의 크기, 파일 속성 등을 나타낸다.
  • IMAGE_OPTIONAL_HEADER

    - IMAGE_OPTIONAL_HEADER는 PE 파일이 메모리에 로드 될 때 필요한 중요한 정보를 담고있다. 기본 필드들과 함께 주요 섹션과 정보의 위치 및 크기를 나타내는 IMAGE_DATA_DIRECTORY 구조체의 배열이 존재한다.

참고 문헌 : (윈도우 실행 파일 구조와 원리로 배우는)리버스 엔지니어링 1권 : 파일 구조 편 - 이호동 (지은이)한빛미디어

profile
보안을 공부합니다

0개의 댓글