728x90
메모리 레이아웃 : 프로세스 가상 메모리의 구성
가상 메모리 : 프로그램을 실행할 때 운영체제가 프로세스에게 할당해주는 사용가능한 메모리 공간
프로세스 메모리 구조
섹션
- 윈도우의 PE 파일 : PE 헤더 + 1개 이상의 섹션
- PE 헤더 : 섹션에 대한 정보
- 섹션의 이름
- 섹션의 크기
- 섹션이 로드될 주소의 오프셋
- 섹션의 속성과 권한
위 내용을 가지고 PE의 각 섹션들을 가상 메모리의 적절한 세그먼트에 매핑 - 섹션 : 유사한 용도로 사용되는 데이터가 모여있는 영역
.text
- 실행 가능한 기계코드
- 프로그램이 동작하려면 코드 실행 필요 -> 읽기 권환과 실행 권한이 부여
- 쓰기 권한 있으면 코드 삽입이 쉬워지므로 쓰기 권한 제거
.data
- 컴파일 시점에 값이 정해진 전역 변수
- CPU 가 데이터를 읽을 수 있어야 함 -> 읽기/쓰기 권한이 부여
int data_num = 31337;
char data_rwstr[] = "writable_data"; // data
int main() { ... }
.rdata
- 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보
- CPU 가 데이터를 읽을 수 있어야 함 -> 읽기 권한
- str_ptr : 전역 변수 .data
- readonly : 상수 문자열 .rdata
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;
}
728x90
'리버싱' 카테고리의 다른 글
[드림핵] 6. x86 Assembly🤖: Essential Part(2) (0) | 2024.05.18 |
---|---|
[드림핵] 5. x86 Assembly🤖: Essential Part(1) (0) | 2024.05.18 |
[드림핵] 3. Background: Computer Architecture (0) | 2024.05.18 |
[드림핵] 2. Background: Static Analysis vs. Dynamic Analysis (0) | 2024.05.18 |
[드림핵] 1. Background: Binary (0) | 2024.05.18 |