동아리/팀 스터디
[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가지
- VirtualSize : 메모리에서 섹션이 차지하는 크기
- VirtualAddress : 메모리에서 섹션의 시작 주소(RVA) - VA는 절대주소 아님
- SizeOfRawData : 파일에서 섹션이 차지하는 크기
- PointerToRawData : 파일에서 섹션의 시작 주소
- 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