windows-0x01

oogu ㅣ 2024. 3. 6. 10:51

https://linarena.github.io/windows-0x00

 

windows-0x00

0x00. 서문 안녕하세요. Joel-Park입니다. “Windows Exploit”이라는 주제로 연재를 시작하게 되었습니다. 본격적으로 시작하기 전에 왜 이 연재를 시작하게 되었는지, 어떤 주제들을 다룰 것인지를 먼

linarena.github.io

좋은 윈도우 자료가 있어 위 글을 정리하면서 공부하도록 하겠습니다!

참고로 위 글은 windows_7_x86 대상으로 합니다.

 

 

1. x86 메모리 구조

x86 윈도우의 경우 프로세스 별 최대 4GB 메모리를 지원합니다.

이 중 상위 절반(0xFFFFFFFF ~ 0x80000000)은 OS 메모리로 사용하고(커널), 하위 절반(0x7FFFFFFF ~ 0x00000000)은 프로세스가 독립적으로 사용 할 수 있도록 제공합니다.(유저)

 

 

[그림 1-1]은 x86 윈도우에 의해 지원되는 전형적인 가상 주소 공간 배치를 보여줍니다.

커널 영역은 다른 프로세스와 공통으로 사용되는 구조로 되어 있습니다. 그리고 이 영역은 OS가 사용하는 중요한 영역입니다.

따라서, 윈도우에서는 유저 영역에서 OS의 데이터에 접근하거나 수정하는 것을 막기 위해 두 가지 접근 모드(커널, 유저)를 사용합니다.

유저 모드는 커널 영역에 접근 할 수 없지만, 커널 모드는 모든 시스템 메모리와 모든 CPU 명령어 등에 대해 접근이 가능합니다.

위는 커널 모드, 유저 모드를 뜻하는 다양한 용어입니다.

두 가지 모드를 나누어 특정 애플리케이션 오작동으로 커널 영역에 쓰기 동작 같은 경우를 막아 시스템 안정성을 유지할 수 있습니다.

 

 

 

2. x86 유저 영역 메모리 구조

[그림 1-2]

[그림 1-2]는 우리가 중점적으로 알아볼 유저영역 메모리 배치입니다.

Stack, Heap, 공유라이브러리, PE Image 등으로 구성되어 있습니다. 각 영역은 ASLR 보호기법으로 메모리에 임의의 배치 됩니다.

 

 

3. 가상 메모리

이 글 도입부에 프로세스 별로 4GB 메모리를 지원한다고 했습니다. 그런데 일반적인 PC의 RAM은 8~16GB 정도인데, 어떻게 실행하는 모든 프로세스마다 4GB를 지원할 수 있을까요?

가상 메모리가 이를 가능하게 합니다.

 

가상 메모리란, 애플리케이션을 실행하는 데 최소한 얼마만큼의 메모리가 필요한가에 집중한 방법입니다.

(위 방법이 가능한 이유는 메모리 접근은 순차적이고 지역화되어 있기 때문입니다.)

쉽게 어떤 프로세스가 실행될 때 메모리에 일부분만 메모리에 올려지고 나머지는 디스크에 올라갑니다.

이를 통해, 빠르고 작은 RAM을 크고 느린 디스크와 병합하여, 하나의 크고 빠른 가상 메모리 처럼 동작하게 하는 것입니다.

 

참고로 디스크, 메모리에 매핑하는 데이터의 단위를 페이지라고 부르고 기본 크기는 4KB입니다.

 

 

 

4. 공유 메모리

공유 메모리란, 프로세스와 OS 사이의 공통으로 사용하는 메모리를 이야기 합니다. 

각 프로세스는 개별 데이터를 저장하거나 실행하기 위해 자신만의 메모리 공간을 갖겠지만, 여러 프로세스에서 동일하게 사용하는 부분은 굳이 여러 번 메모리에 할당할 필요가 없습니다.

그래서 윈도우는 [그림 1-3]과 같이 동일한 dll이나 다른 자원을 물리 메모리에 한 번만 로딩시키고 공유해서 사용하도록 구성되어 있습니다.

[그림 1-3]

위 구조를 사용함으로써 메모리를 좀 더 효율적으로 사용할 수 있게 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

'윈도우 공부' 카테고리의 다른 글

windows-0x05  (0) 2024.03.08
JMP SHORT, 어디까지 점프 가능한가?  (0) 2024.03.06