코스소개

컴퓨터는 CPU와 메모리로 구성되어 있다.

- CPU : 실행할 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽고 Instruction Set Architecture(ISA)에 따라 처리한다.

- 메모리 : 연산의 결과를 다시 메모리에 적재한다.

--> CPU의 동작과 메모리 사이에 밀접한 연관 있음을 의미

 

메모리 오염 취약점

공격자가 만약 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못 동작 할 수 있다.

 

 

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

리눅스에서 프로세스의 메모리를 5개의 세그먼트로 구분한다. 세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈것으로 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙 세그먼트, 스택 세그먼트로 구분된다.

 

운영체제가 메모리를 용도별로 나누면 각 용도에 맞게 적절한 권한을 부여할 수 있다는 장점이 있다. 권한은 읽기, 쓰기, 실행이 존재하고 CPU는 메모리에 대해 권한이 부여된 행위만 할 수 있다.

 

예를 들어, 데이터 세그먼트는 프로그램이 실행되면서 사용하는 데이터가 적재된다. CPU는 이곳의 데이터를 읽을 수 있어야 하며 이 영역에는 읽기 권한이 부여된다. 반면에 이 영역의 데이터는 실행 대상이 아니므로 실행권한은 부여되지 않는다.

 

코드 세그먼트

위치 하는 것 : 실행 가능한 기계 코드가 위치하는 영역(=텍스트 세그먼트)

권한 : 프로그램 동작시 코드를 실행하기 위해 읽기 권한실행권한이 부여된다.

* 쓰기권한이 있으면 공격자ㅏㄱ 악의적인 코드를 삽입하기 쉬워져 대부분 운영체제는 이 세그먼트에 쓰기 권한을 제고한다.

 

데이터 세그먼트

위치 하는 것 : 컴파일 시점에 값이 정해진 전역변수전역 상수들이 위치한다.

권한 : CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로 읽기 권한 부여된다.

 

    쓰기가 가능한 데이터 세그먼트 = 전역변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다.

                                                       = data 세그먼트

    쓰기가 불가능한 데이터 세그먼트 = 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치한다.

                                                          = rodata(read-only data) 세그먼트

 

BSS 세그먼트

위치 하는 것 : 컴파일 시점에 값이 정해지지 않은 전역변수가 위치하는 메모리 영역이다.

                       선언만 하고 초기화 하지 않은 전역변수 등이 포함된다.

                       이 세그먼트의 메모리 영역은 프로그램이 시작될 때 모두 0으로 값이 초기화 된다.

                        --> c코드 작성 시 초기화 하지 않은 변수 값은 0이 된다.

 권한 : 읽기 권한, 쓰기 권한 부여된다.

 

스택 세그먼트

위치 하는 것 : 프로세스의 스택이 위치하는 영역이다.

스택 세그먼트는 '스택 프레임' 단위로 사용된다.

    스택프레임 = 함수가 호출될 떄 생성되고 반환될때 해제된다.

권한 : 읽기 권한, 쓰기 권한 부여된다.

 

힙 세그먼트

위치 하는 것 : 힙 데이터가 위치하는 세그먼트 이다.

스택과 마찬가지로 실행중에 동적으로 할당될 수 있고 리눅스에서는 스택과 반대방향으로 자란다.

c언어에서 malloc(), calloc()등을 호출해서 해당하는 메모리가 이 세그먼트에 위치한다.

권한 : 읽기 권한, 쓰기 권한 부여된다.

 

 

+ Recent posts