리버싱

[드림핵] 4. Background: Windows Memory Layout

코딩 못하는 공대생 2024. 5. 18. 03:32
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