동아리/팀 스터디

[8기 기초] 리버싱 팀 06

bento 2023. 11. 10. 23:41

Section header

: 각 섹션의 속성(Property)을 정의한 것

 

code/data/rsrc 3가지로 나누어 섹션을 저장하는 이유?

프로그램 복잡함 감소 / 프로그램 안전성

→ 각 분류마다 권한이 주어져 있다

 

code: 실행, 읽기 권한

data: 비실행, 읽기 권한

rsrc: 비실행, 읽기 권한

typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

 

주요 5가지

  1. VirtualSize : 메모리에서 섹션이 차지하는 크기
  2. VirtualAddress : 메모리에서 섹션의 시작 주소(RVA) - VA는 절대주소 아님
  3. SizeOfRawData : 파일에서 섹션이 차지하는 크기
  4. PointerToRawData : 파일에서 섹션의 시작 주소
  5. Characteristics : 섹션의 속성 (bit OR)

 

RVA To RAW

PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 파일 오프셋(offset)을 매핑

이러한 매핑 과정 → 'RVA To RAW’

 

RVA가 속해 있는 section을 찾고 비례식을 통해 파일 offset(RAW)를 계산

 

RAW - PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData


CodeEngn


7a2896BF 와 비교하는 걸 찾을 수 있다

키 값이 맞는 걸 확인

창에 출력하기 위해 overwrite할 영역을 찾아준다

Key값 + 주소영역을 찾으라했으니

2049480383 + 0D3B + 0D45

 

20494803830D3B0D45

728x90