[모각코] 2주차 보고서(가상 주소 공간)

semon·2023년 1월 14일
0

22-23_동계 모각코

목록 보기
3/7

1. 가상주소공간(Virtual Address Space, VAS)

  • 말 그대로 가상으로 존재하는 주소 공간으로 프로세스가 필요한 메모리 공간을 모두 충족 할 수 없으므로 가상 주소 공간을 만들어 마치 프로세스에 그 메모리 공간이 할당 된것처럼 하는 방식이다.
  • 32비트 프로세스의 경우 4기가 바이트, 64비트 프로세스는 16엑사 바이트의 가상 주소 공간을 갖는다.
  • 이 공간을 실제 물리적 기억장치인 RAM(Random Access Memory)에 연결을 시켜주는 것이 VMM(Virtual Memory Manager)이다.

2. 가상 메모리 관리자(Virtual Memory Manager, VMM)

  • VMM은 커널 모드에 위치하는 윈도우 컴포넌트로, 동시에 실행되는 프로세스들의 가상 주소 공간과 제한된 용량을 가지는 물리적 기억장치 사이에 중재 역할을 한다.
  • 페이지 파일과 RAM,가상 주소 공간이 VMM에 의해 관리 되면서 프로세스에게는 마치 4G 또는 16E의 선형 공간을 독점하고 있다고 생각하게 만드는 매트리스를 제공한다.
  • 가상 주소 공간은 말 그대로 가상이지만 프로세스의 특정 스레드가 가상 주소 공간내의 특정 번지를 엑세스할 때 VMM은 해당 번지가 소속된 페이지(메모리 관리 단위)를 페이지 파일과 매핑시켜준다. 즉, 해당 가상 주소 공간에서 행하는 읽고 쓰기와 같은 해당 페이지 파일의 특정 페이지에 동일한 행위를 하는 것과 같은 것이다.
  • VMM은 이 페이지 파일내에서 RAM과 스와핑을 통해 물리적 기억장치에 액세스가 가능하도록 보장해준다.
    가상 주소 공간은 페이지 파일에 매핑되어 있어야 사용 가능하므로 매핑이란 가상 주소 공간과 페이지 파일 사이의 페이지 단위의 대응을 의미한다.
  • 페이지란 가상 주소 공간을 관리하기 위해 시스템이 사용하는 메모리 단위로 윈도우는 4KB를 사용한다.
    페이지는 해제(Free), 예약(Reserve), 확정(Commit) 세 가지 상태를 갖는다.
    - 해제 상태는 영역이 할당되지 않은 상태를 말한다.
    - 예약 상태는 가상 주소 공간에 VirtualAlloc과 같은 함수로 영역을 할당했을 때 그 영역을 우선 예약 상태라고 한다. 윈도우의 경우 예약 영역의 시작 번지는 가상 메모리 할당 단위인 64K의 배수 값이 되어야 하고 영역의 크기는 페이지 단위로 관리 되므로 페이지 단위의 배수여야 한다. 하지만 예약만 한다고 해당 영역을 사용할 수는 없다. 영역을 사용하기 위해서는 그 영역을 페이지 단위로 확정 해야한다. 즉, 예약을 한다는 것은 가상 주소 공간에 메모리가 할당된 것이고 이를 사용하려면 물리적 기억 장소와 매핑되어야 한다.
    - 확정 상태는 예약된 영역의 페이지를 물리적 기억 장치와 매핑하는 행위를 의미하며 이렇게 매핑이 이루어져 페이지 단위로 대응 된것을 확정되었다고 한다. 예약 영역의 시작 번지는 64K의 배수가 되어야 하지만 확정은 페이지 단위로 이루어지므로 확정 영역의 번지나 크기는 페이지 단위인 4K의 배수가 된다.

3.메모리 매핑 파일(Memory Mapping File, MMF)

  • 매핑된 페이지가 확정(Commit)된 파일이라면 가상 주소 공간의 특정 페이지에 접근 한다는 것은 페이지 파일의 일부에 그 페이지가 매핑되어야 한다. 이는 가상 주소 공간과의 매핑 대상을 앞에서는 생략한 PageFile.sys라는 시스템 파일에만 국한시키는 것이 아닌 사용자가 직접 열거나 생성한 파일도 그 대상으로 삼을 수 있다는 것이다. 이처럼 파일 자체가 PageFile.sys의 역할을 대신하는 경우를 메모리에 매핑된 파일이라하고 이 MMF는 세가지 용도로 사용된다.
    1. EXE와 DLL 파일의 로드와 실행
    2. 사용자가 직접 디스크 내의 데이터 파일에 엑세스
    3. IPC의 수단으로 메모리 공유
  • MMF로 사용되는 파일은 PageFile.sys처럼 직접 가상 주소 공간과 매핑된다. 사용자는 윈도우가 제공하는 CreateFileMapping, MapViewOfFile(Ex), UnmapViewOfFile 함수로 일반적인 파일을 MMF로 만들 수 있고 이는 위에 2, 3번과 같은 목적으로 사용할 수 있다. 하지만 시스템은 1의 목적으로 PE파일을 MMF로 사용한다.
    만약 exe파일을 실행 시킨다면 시스템은 다음과 같은 과정으로 프로세스를 생성한다.
    1. 시스템은 사용 개수가 1개인 새로운 프로세스 커널 객체를 생성한다.
    2. 시스템은 새로운 프로세스를 위해 4G(32비트) 또는 16E(64비트) 크기의 가상 주소 공간을 생성한다.
    3. 시스템은 가상 기억 공간에 EXE 파일을 포함할 만큼 충분히 큰 주소 공간 영역을 예약한다. 이 영역의 시작 주소는 EXE 파일의 IMAGE_OPTIONAL_HEADER의 ImageBase 필드에 설정되어 있다.
    4. 시스템은 예약된 영역이 실제 구현되는 물리적 기억 장소가 시스템에 있는 페이지 파일이 아닌 디스크에 있는 EXE 파일내라는 것을 기억한다.

이후 다음과 같은 과정으로 DLL파일을 로드한다.

  1. 시스템은 DLL파일을 포함할 만큼 큰 공간을 예약한다. 마찬가지로 DLL의 ImageBase필드에 시작 주소가 설정되어 있다.
  2. 만약 DLL을 로드하고자 하는 영역의 시작 번지를 다른 DLL이나 EXE 파일이 점유하고 있거나 그 영역이 충분히 크지 않아 시스템이 선호하는 위치에 DLL을 위한 영역을 예약할 수 없다면 다른 주소 공간을 찾아서 DLL을 로드한다.
  3. 시스템은 예약된 영역이 실제 구현되는 물리적 기억 장소가 시스템에 있는 페이지 파일이 아닌 디스크에 있는 DLL 파일내라는 것을 기억한다.

이와 같이 EXE나 EXE가 가져와야 하는 모든 DLL이 EXE의 프로세스 주소 공간에 매핑한 후 시스템은 EXE의 시작 루틴을 호출하여 프로그램을 게시하고 이와 관련된 페이징 처리, 버퍼링, 캐시 처리를 수행한다. 위의 과정이 모두 완료되면 EXE와 DLL은 PE파일 자체가 MMF가 된다.
이처럼 PE파일은 PE파일 자체가 MMF가 된다. 즉, PE파일을 로딩 할 때 가상 주소 공간에 PE를 매핑시킨다. 매핑을 위한 가상 주소 공간 상의 로딩 위치나 크기에 관련된 모든 정보는 PE파일 내에 정의되어 있다.

만약 같은 프로그램을 두 번 실행 시키는 경우가 있을 경우 두 개의 프로세스가 실행 될 것이다. 그리고 이 두 프로세스는 하나의 PE 파일을 페이지 파일로 사용할 것이다. 이 경우 하나의 프로세스에서 메모리에 데이터를 쓴다 하더라도 다른 프로세스의 가상 주소 공간의 내용은 바뀌지 않는다.
만약 메모리의 페이지 속성이 실행 가능이라면 'Copy-on-Write'라는 메커니즘을 통해 쓰기 동작이 수행된다.
'Copy-on-Write'란 '실행 가능' 속성을 가진 페이지의 데이터를 갱신하면 시스템은 해당 페이지의 데이터를 갱신하기 전에 페이지 파일로 복사본을 백업 후에 해당 페이지를 갱신하는 것을 말한다.
이로 인해 같은 프로그램을 두 개 이상 실행 하여도 각각 독립적인 가상 주소 공간을 유지할 수 있다.

참고 문헌 : (윈도우 실행 파일 구조와 원리로 배우는)리버스 엔지니어링 1권 : 파일 구조 편 - 이호동 (지은이)한빛미디어

profile
보안을 공부합니다

0개의 댓글