컴퓨터는 크게 CPU와 메모리로 구성되어 있다.
CPU는 명령어와 데이터를 메모리에서 읽어 ISA(Instruction Set Architecture)의 규약에 따라 처리한다. 그리고 연산의 결과를 다시 메모리에 적재한다. 이는 CPU가 메모리와 밀접한 연관이 있다는 뜻으로, 메모리 구조에 대해 이해하는 것은 매우 중요하다.
리눅스 메모리 구조를 이루는 총 5가지 세그먼트에 대해 알아보자.
어셈블리어를 학습하는 측면에서
어셈블리어를 사용하면서 데이터는 용도에 따라 특정 영역에 나뉘어 들어가게 되는데, 어떤 데이터가 어떤 영역에 들어가는지 알면 어셈블리어를 사용하거나 디버깅할 때 훨씬 더 수월해진다.
시스템 해킹을 학습하는 측면에서
CPU의 동작과 메모리 사이에 밀접한 연관이 있다. 만약 공격자가 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못된 동작을 할 수 있다. 우리는 이를 메모리가 오염됐다고 표현하며, 이를 유발하는 취약점을 메모리 오염(Memory Corruption) 취약점이라 부른다.
시스템 해킹을 공부하는 입장에서는 Stack Buffer Overflow, Format String Bug, Use After Free, Double Free Bug와 같은 다양한 메모리 오염과 관련된 취약점을 학습하게 될 것이다. 이러한 취약점들은 메모리와 밀접한 연관이 있기 때문에 이들이 각각 어떻게 공격에 활용되는지 잘 이해하고 방어하려면 메모리 구조를 잘 이해하고 있어야 한다.
리버스 엔지니어링을 학습하는 측면에서
소프트웨어 리버스 엔지니어링의 핵심은 바이너리를 분석하여 바이너리의 동작을 이해하는 것이다. 그런데 바이너리의 동작은 메모리와 굉장히 밀접한 관련이 있다. 따라서 바이너리의 동작을 자세히 이해하기 위해서는 바이너리가 상호작용하는 메모리에 대한 이해가 필요하다.
보안이라는 분야는 결국 컴퓨터를 보호하는 것이며 이를 위해서는 컴퓨터가 어떻게 동작하는지 깊이 이해하는 것이 중요하다. 메모리 레이아웃은 컴퓨터가 데이터를 관리하는 근본적인 구조이므로, 이를 제대로 익혀두면 다양한 보안 분야를 학습할 때 큰 도움이 된다.
프로세스가 실행될 때, 각 프로세스는 독립된 메모리 공간을 할당받는다.