본문 바로가기
about Security/시스템 해킹

[드림핵] Linux Memory Layout

by saniii 2022. 3. 26.

프로세스 가상메모리의 각 구영이 어떤 정보를 담고 있는지 이해함으로써 프로세스 메모리의 전체 구조에 대해 큰 그림을 그려보자..!

 

CPU는 실행할 명령어와 데이터를 메모리에서 읽고 ISA에 따라 처리하고 처리한 결과를 다시 메모리에 적재한다. 

즉, CPU의 동작과 메모리는 서로 영향을 많이 주고 받는다. 

만약 공격자가 메모리를 악의적으로 조작한다면 CPU는 공격자의 의도대로 동작할 수 있으며 이를 메모리가 오염됐다고 표현한다. 

>> 메모리 오염 (memory Corruption) 취약점 

* 시스템 해킹의 많은 공격기법들이 메모리 오염을 기반으로 한다. 

 

 

# 리눅스 프로세스의 메모리 구조 

리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분한다. 

+ 세그먼트 (segment) : 적재되는 데이터의 용도별로 메모리를 나눈 것

출처 : dreamhack

메모리를 용도별로 나누면 각 용도에 맞게 읽기, 쓰기, 실행에 대한 적절한 권한을 부여하여 CPU가 권한이 부여된 작동만 할 수 있도록 할 수 있다. 

* 세그먼트를 자세히 이해하고자 할 때는 운영체제의 메모리 관리기법인 세그먼테이션 기법과 x86-64와 관련된 하드웨어의 설계를 공부!

 

> 코드 세그먼트, Code segment, Text segment

- 실행 가능한 (기계)코드가 위치하는 영역

- 읽기, 실행 권한 부여됨

     - 프로그램이 동작하려면 코드를 실행할 수 있어야 하기 때문

     - 쓰기 권한이 있으면 공격자가 악의적인 코드를 삽입하기 쉬워진다. 

 

** 기계코드 : 가능한 빨리 실행되도록 의도된 숫자언어, 하드웨어 종속(최하위) 프로그래밍 언어

                  : 고급 언어를 컴파일러, 어셈블러, 링커등을 통해 기계 코드르 변환하여 사용한다. 

 

▶ 고급 언어로 프로그래밍된 프로그램을 컴파일하면 변환된 기계코드가 코드 세그먼트에 위치하게 된다. 

 

 

> 데이터 세그먼트, Data segment 

- 컴파일 시점에 값이 정해진 (초기화된) 변수 및 상수들이 위치한다. 

- 읽기 권한 부여됨 

     - CPU가 해당 세그먼트 데이터를 읽어야 하기 때문

- 쓰기 권한은 경우에 따라 다르다

     - data 세그먼트 : 프로그램이 실행되면서 값이 변할 수 있는 데이터

              ▶ 쓰기 권한을 가진다. 

                  ex) 전역 변수  

     - rodata (read-only data) 세그먼트 : 값이 변하면 안되는 데이터

              ▶ 쓰기 권한 없다. 

                  ex) 전역 상수 

 

 

> BSS 세그먼트, Block Started By Symbol segment 

- 컴파일 시점에 값이 정해지지 않은 (초기화되지 않은) 데이터들이 위치한다. 

- 읽기, 쓰기 권한 부여됨 

 

- 이 영역에 위치하는 변수들은 프로그램이 시작될 때 값이 0으로 초기화된다.  

 

 ex) 선언만 하고 초기화하지 않은 전역 변수 .... 

 

 

> 스택 세그먼트, Stack Segment

- 임시 변수가 저장된다. 

- 프로세스의 스택이 위치한다. 

 

 

 

 

 

> 힙 세그먼트, Stack Segment

- 실행 중에 동적으로 사용되는 영역

 

 

ex) malloc(), calloc()등으로 할당받은 메모리 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ 참조 ]

본 페이지는 드림핵(dreamhack.io)의 시스템 해킹 로드맵, STAGE2를 정리한 글입니다. 

'about Security > 시스템 해킹' 카테고리의 다른 글

[드림핵] x86 Assembly  (0) 2022.03.26
[드림핵] Computer Architecture  (0) 2022.03.26

댓글