profile image

L o a d i n g . . .

 

메모리 주소

보통 노트북은 4GB의 램을 쓰는데,

4GB를 Byte 단위로 변환하면 2^32Byte이다.

 

그리고 1Byte는 주소공간 한 개의 크기이다.

즉, 4GB는 2^32개의 주소를 가질 수 있다.

 

또 한편, 1 bit는 0 또는 1의 값만 가질 수 있기에 32bit는 2^32만큼의 숫자를 표현할 수 있다.

32 bit 라는 것은 2^32개의 주소를 가지고 있다라는 뜻이다.

 

따라서 32bit 운영체제는 수 표현을 최대 2^32까지 밖에 못 하기 때문에,  8GB나 16GB의 램을 가지고 있다고 하더라도 접근을 할 수가 없다.

 

0000…0000(32개) 부터  1111….1111(32개) 까지를 보기 편하게 16진수로 변환하면?

00000000 ~ FFFFFFFF이다!

 

 

유저 영역, 커널 영역

시스템 운영에 필요한 메모리, 그리고 운영체제가 커널 영역에 올라가 있다.
사용자가 운영체제가 올라가 있는 커널 영역에 마음대로 접근할 수 있다면, 시스템이 안정적으로 운용될 수 없을 것이다.

그렇기에 사용자가 함부로 커널 영역에 접근할 수 없도록 메모리를 유저영역과 커널영역을 나누어 사용한다.

나누는 크기는 운영체제마다 다르고, 설정에 따라 영역의 크기를 조정할 수도 있다.

 

 

유저 영역의 메모리

코드 영역

c 파일을 컴파일하면 어셈블리 코드로 바뀌는데, 이런 low-level language가 코드 영역에 올라 간다.

 

 

데이터영역

전역변수가 이 영역에 로드되는데 항상 동일한 메모리에 위치하게 된다.

고정된 메모리 주소 그리고 그 주소에 원하는 값을 쓸 수 있기에 익스플로잇에 활용될 가능성이 높다.

여기까지가 고정된 주소에 올라오는 영역이다.

 

 

힙 영역

힙 영역은 동적으로 메모리를 할당하여 사용하는 공간이다.
대표적인 메모리 할당 함수로는 malloc가 있는데, malloc으로 필요한 공간을 할당하면 힙 영역을 쓰게 된다. 쓰다가 필요 없어지면 해제 해주면 된다.

힙 영역에 어떤 값을 엄청 많이 뿌려놓고 free 해준 후 다시 이 공간을 재사용하므로써 익스플로잇할 때 활용된다.

 

 

스택 영역

마지막은 (유저영역) 메모리의 가장 바닥부터 채워지는 스택이 있다.
스택은 거꾸로 자라는데 그 이유는 커널이 밑에 있기에 건드리지 않도록 하기 위해서이다.


스택영역은 함수인자나 지역변수들이 올라온다.

힙과 스택은 고정된 메모리에 올라오는 것이 아니기 때문에, 이 영역을 활용해 한번에 쉘을 획득하기란 어렵다.

 

 

 

참고
https://bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/
복사했습니다!