PE파일 더 알아보기
- PE파일 만들어지는 과정: 고급 언어 -> 컴파일러 -> 기계어(PE 구조)
- PE파일의 종류: 실행계열(EXE, SCR), 라이브러리계열(DLL, OCX, XPL, DRV), 드라이버계열(SYS, VXD), 오브젝트파일계열(DBJ)
PE파일의 구조
- PE헤더: PE파일의 전체적인 정보를 담은 부분
- MS-DOS헤더
- IMAGE_DOS_HEADER: 가장 시작 부분에 위치, 기본적인 오류 메시지 출력, PE헤더의 위치 가리킴
- MS-DOS Stub Program: 오류 메시지 저장 및 출력
- IMAGE_NT_HEADERS: PE파일이 어떻게 로드되고 실행될 지 저장 (메타데이터 저장), 구조체로 정의됨
signature: 0x00004550 상수 (아스키로 PE)
IMAGE_FILE_HEADER: PE파일의 구조, 특성 표시 (CPU아키텍쳐, 시간, OPTIONAL_HEADER의 크기 등)
IMAGE_OPTIONAL_HEADER: 로딩, 실행에 필요한 추가 정보 저장 (이미지베이스(PE파일 저장되는 시작 주소), RVA, VA등이 저장됨)
- 파일 헤더
- 선텍적 헤더
- MS-DOS헤더
- 섹션 헤더: 각 섹션에 대한 정보를 담은 부분
예)- Name: 섹션의 이름 (.text, .data, .rdata 등)
- Virtual size: 메모리에 로드 될 때 섹션의 크기
- Virtual Address: 섹션 가상주소 오프셋
- Pointer to Raw data: 파일 내에서 차지하는 실제 크기 (Virtual Address와 다를 수도 있다)
- 섹션 데이터 헤더: 실제 사용되는 코드, 데이터 리소스 등을 담은 부분
- 섹션의 이름에 따른 내용들 예)
- .text: 실행 코드
- .data: 초기화된 전역, 정적 변수
- .rdata: 변하지 않는 값 (리터럴, 변경 안한 전역변수)
- .bss: 초기화되지 않은 전역, 정적 변수
- .rsrc: 리소스 데이터
물론 관습적인 이름이라 섹션 헤더에서 이름만 잘 정의되었다면 딴 이름으로 써도 됨
- 섹션의 이름에 따른 내용들 예)
주소 지정 방법
- pFile: PE파일 내부의 오프셋 값 (PE파일 시작부터 얼마나 떨어져 있는가?)
- RVA: PE파일 메모리에 로드되었을 때 저장되는 상대주소 (이미지베이스 기준 상대주소)
- VA: 가상메모리 상에서 나타나는 실제 주소 (이미지베이스 + RVA)
pFile은 물리적으로 하드디스크에 저장되었을 때 의미있는 값, RVA, VA는 메모리에 로드되었을 때 의미있는 값
IAT(Important Address Table): 어떤 라이브러리의 무슨 함수를 가져다 쓰는지 기록한 테이블
API이름과 실제 API의 주소를 기록한다.
728x90
반응형
'리버싱 입문' 카테고리의 다른 글
[리버싱 입문](6)[함수 호출 규약] (0) | 2025.02.10 |
---|---|
[리버싱 입문](5)[abex crackme 3] (0) | 2025.02.07 |
[리버싱 입문](4)[abex crackme 2] (1) | 2025.02.06 |
[리버싱 입문](3)[abex crackme 1] (0) | 2025.02.05 |
[리버싱 입문](1)[PE파일, 레지스터와 메모리] (0) | 2025.02.03 |