본문 바로가기

개념정리/Reverse Engineering

4. Windows Memory Layout

 

저번 시간에는 정적 분석과 동적 분석에 대하여 공부하였다.

이번 시간에는 윈도우 메모리 레이아웃에 대하여 공부할 것이다.

 


1. 메모리 레이아웃

메모리 레이아웃은 프로세스 가상 메모리의 구성을 말한다. 가상 메모리는 프로그램을 실행할 때 운영체제가 프로세스에게 사용 가능한 메모리 공간을 할당해주는데 이 때 메모리 공간을 의미한다. 운영체제는 프로그램의 정보를 참조하여 프로그램에 저장된 데이터가 적절한 영역에 저장되게 해야 한다. 

2. 섹션

윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성되어 있다. 섹션은 유사한 용도로 사용되는 데이터가 모여있는 영역이다. 섹션에 대한 정보는 PE 헤더에 적혀져 있다. 

※ PE 헤더에 저장되어 있는 섹션과 관련된 데이터

  • 섹션의 이름
  • 섹션의 크기
  • 센션의 로드될 주소의 오프셋
  • 섹션의 속성과 권한

윈도우는 PE 파일을 실행할 때, 이 정보를 참조하여 PE의 각 섹션들을 가상 메모리의 적절한 세그먼트에 매핑한다. PE 파일에 일반적으로 사용되는 섹션은 1) .text 섹션, 2) .data 섹션, 3) .rdata 섹션이 있다.

1) .text

실행 가능한 기계 코드가 위치하는 영역이다. 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한과 실행 권한이 부여된다. 쓰기 권한이 있으면 공격자가 악의적인 코드를 삽입하기 쉬워지기 때문에 쓰기 권한은 제거한다. 

//main 함수가 컴파일되면서 기계 코드로 바뀌며 .text섹션에 위치한다.
int main() {
    return 0;
}


2) .data

컴파일 시점에 값이 정해진 전역 변수들이 위치한다. CPU가 이 섹션의 데이터를 읽고 쓸 수 있어야 하므로, 읽기/쓰기 권한이 부여된다.

// 컴파일 시점에 값이 정해진 전역 변수가 .data 섹션에 위치힌다.
int data_num = 1111;
char data_str[] = "data"; 

//main 함수는 기계 코드로 변하고 .text 섹션에 위치한다.
int main() { 
	return 0;
}


3) .rdata

컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장된다. CPU가 이 섹션의 데이터를 읽을 수 있어야 하므로, 읽기 권한이 부여되지만 쓰기는 불가능하다.

// str_ptr은 전역변수여서 .data 섹션에 위치한다.
// "readonly"는 상수 문자열이기 때문에 .rdata 섹션에 위치한다.
char *str_ptr = "readonly";

//main 함수는 기계 코드로 변하고 .text 섹션에 위치한다.
int main() { 
	return 0;
}

 

3. 섹션이 아닌 메모리

프로그램 실행에 있어 필요한 1) 스택2) 힙도 가상 메모리 공간에 적재된다.

1) 스택

윈도우 프로세스의 각 쓰레드는 자신만의 스택 공간을 가지고 있다. 보통 지역 변수나 함수의 리턴 주소가 저장된다. 이 영역은 자유롭게 읽고 쓸 수 있어야 하기 때문에 읽기/쓰기 권한이 부여된다. 스택은 기존 주소보다 낮은 주소로 확장된다.

3) 힙

프로그램이 여러 용도로 사용하기 위해 할당받는 공간이다. 모든 종류의 데이터가 저장될 수 있다. 스택과 다른 점은 비교적 스택보다 큰 데이터도 저장할 수 있고 전역적으로 접근이 가능하다. 또한 실행 중 동적으로 할당받는다. 데이터를 읽고 쓰기만 하기 때문에 읽기/쓰기 권한을 가지나 실행권한을 가지는 경우도 있다.

 


 

이번 시간은 윈도우 메모리 레이아웃을 공부하였다.

 

'개념정리 > Reverse Engineering' 카테고리의 다른 글

3. 정적 분석 & 동적 분석  (0) 2022.08.02
2. Binary  (0) 2022.08.02
1. 리버스 엔지니어링  (0) 2022.07.28