Hacking/Reverse Engineering
Windows Memory Layout
씨이오가 되자
2024. 5. 2. 21:10
728x90
메모리 레이아웃? 프로세스 가상 메모리의 구성을 말함.
프로세스 메모리구조
1) 섹션 = 유사한 용도로 사용되는 데이터가 모여있는 영역
- 윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성되어 있음
- 섹션에 대한 정보는 PE 헤더에 있음
중요 -> 섹션의 이름, 섹션의 크기, 섹션의 로드될 주소의 오프셋, 섹션의 속성과 권한
윈도우는 PE를 실행할 떄, 이런 중요 정보를 참조하여 PE의 각 섹션들을 가상 메모리의 적절한 세그먼트에 매핑함.
주로 .text, .data, .rdata 섹션이 일반적으로 사용됨
".text"
- 실행 가능한 기계 코드가 위치하는 영역
- 읽기 권한과 실행 권한 부여.
".data"
- 컴파일 시점에 값이 정해진 전역 변수들이 위치함.
- 읽기/쓰기 권한 부여.
".rdata"
- 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장됨
- 읽기 권한 부여.
const char data_rostr[] = "readonly_data";
char *str_ptr = "readonly"; // str_ptr은 .data, 문자열은 .rdata
int main() { ... }
섹션이 아닌 메모리
윈도우의 가상 메모리 공간에는 섹션만 로드되는 것이 아님
프로그램 실행에 있어 필요한 스택과 힙 역시 가상 메모리 공간에 적재됨
스택
- 지역 변수나 함수의 리턴 주소가 저장됨
- 읽기/쓰기 권한 부여
- 스택이 확장될 때, 기존 주소보다 낮은 주소로 확장됨
힙
- 프로그램이 여러 용도로 사용하기 이해 할당받는 공간
- 모든 종류의 데이터가 저장될 수 있음
- 비교적 스택보다 큰 데이터 저장 가능, 전역적으로도 접근이 가능
- 실행 중 동적으로 할당받음
- 읽기/쓰기 권한
int main() {
int *heap_data_ptr =
malloc(sizeof(*heap_data_ptr)); // 동적 할당한 힙 영역의 주소를 가리킴
*heap_data_ptr = 31337; // 힙 영역에 값을 씀
printf("%d\n", *heap_data_ptr); // 힙 영역의 값을 사용함
return 0;
}
Summary
728x90