| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- ABI
- pe format
- 파이썬
- Reversing
- image section header
- 리치헤더
- 코드엔진
- CodeEngn
- Image dos header
- x64
- x32
- 프로그래머스
- 32bit
- 크랙미
- Calling Convention
- crackme
- Rich Header
- 리버싱
- Python
- 함수 호출 규약
- Programmers
- rev
- RVA
- stack frame
- __vectorcall
- Dos Stub
- 실행파일
- __stdcall
- __fastcall
- __cdecl
- Today
- Total
kj0on
[Techniques] PE 섹션 추가 (로더 관용성 활용) 본문
0. 로더 관용성
윈도우 로더는 모든 필드를 엄격히 검증하지 않기 때문에 일부 스펙을 벗어나더라도 실행에 지장이 없는 경우가 있다. 이러한 특성을 이용하면 표준 권장사항을 지키지 않아도 섹션을 추가할 수 있다.
1. IMAGE_SECTION_HEADER
1-1. Name[8]

Name[8] 멤버는 섹션을 사람이 식별할 수 있도록 돕는 레이블 역할을 하며 윈도우로더가 해당 값을 해석하거나 검사하지는 않는다. 따라서 이름 자체는 임의의 값으로 설정해도 무방하며 단지 8바이트 크기만 충족하면 된다. 또한 NULL로 종료하지 않아도 무방하다.
1-2. Misc.VirtualSize

Misc.VirtualSize 멤버는 섹션이 메모리에서 실제로 점유할 크기를 나타내지만 이 값이 0x0으로 설정되거나 SizeOfRawData보다 작더라도 정상적으로 동작한다. 값이 너무 작게 설정된 경우 윈도우로더가 자동으로 SizeOfRawData의 값을 대신 사용한다. 또한 이 값은 반드시 SectionAlignment 단위로 정렬되어 있을 필요도 없다.
1-3. VirtualAddress

VirtualAddress에는 로더 관용성이 없다. 자동으로 보정해 주지 않기 때문에 반드시 스펙대로 SectionAlignment 단위로 정렬해 주고 전체 섹션 레이아웃을 고려해서 값을 설정해야 한다.
1-4. SizeOfRawData

SizeOfRawData는 FileAlignment로 정렬되어 있을 필요가 없다. 윈도우로더는 이 길이만큼만 디스크에서 읽어오기 때문에 이 값이 파일을 벗어나지 않으면 실행에는 영향을 주지 않는다. 다만 다음 섹션과 겹치거나 주요 섹션의 값을 작게 설정하면 프로그램 오동작으로 이어질 수 있다.
1-5. PointerToRawData

PointerToRawData는 FileAlignment로 정렬되어 있을 필요가 없다. 또한 이 값은 윈도우로더에 의해 FileAlignment 단위를 적용해 자동으로 라운드 다운 된다. 따라서 0x2605로 설정하면 메모리에 로드될 때 0x2600 부터 파일에서 섹션을 읽게된다.
1-6. COFF

PointerToRelocations, PointerToLinenumbers, NumberOfRelocations, NumberOfLinenumbers 멤버는 PE 파일에서 사용되지 않는다. 따라서 아무런 값을 입력해도 실행에 영향을 주지 않는다.
1-7. Characteristics

Characteristics는 섹션의 실제 페이지 권한을 결정하므로 필요한 최소 권한(읽기/쓰기/실행)을 명확히 지정해 두는 편이 안전하다.
2. Section

이후 섹션을 추가해준다. 파일의 끝은 FileAlignment 단위가 아니여도 된다.
3. IMAGE_OPTIONAL_HEADER

IMAGE_OPTIONAL_HEADER에서 로더 처리에 관한 설정은 필수적이다. 이 값을 수정해 주지 않으면 오류가 발생하거나 추가된 섹션이 무시된다.
4. 실행

권장사항에 맞지않게 섹션을 추가해도 정상적으로 프로그램이 실행된다.

PointerToRawData를 0x2605로 설정해도 0x2600부터 값을 읽어온다는 것을 알 수 있다. 오프셋이 0x2000인 이유는 권한이 같아서 .rsrc에 병합되었기 때문이다.
'Reversing > Techniques' 카테고리의 다른 글
| [Techniques] PE 섹션 추가 (권장사항 준수) (1) | 2025.07.08 |
|---|