해당 글의 원문은 아래 링크에서 확인할 수 있다.

bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/

 

우리집에 GDB 있는데… 메모리 보고갈래? (1)

들어가기에 앞서… 컴(존)알못들이여 오라. 보안 공부하다 높다란 진입장벽 앞에서 좌절하신 분들께 이 글을 바칩니다. 해커가 되겠다는 청운을 안고 대학을 입학했으나.. 4년째 뉴비..★ 컴알못

bpsecblog.wordpress.com

4GB 메모리의 구조는 다음과 같다.

4GB는 위의 계산 과정을 거치면 2^32 byte 사이즈의 메모리라는 것을 알 수 있다. 

1 byte는 주소 공간 한 개의 크기 이기 때문에 4GB는 2^32개의 주소를 가질 수 있다.

1bit는 0 과 1 의 값만 가지기 때문에 32bit는 2^32만큼의 숫자를 표현할 수 있다. 

메모리는 주소로 접근하는데 32비트 운영체제는 수 표현을 2^32까지 밖에 못하기 때문에 8GB 이상의 램을 가지고 있어도 접근할 수 없다.

따라서 4GB 메모리 주소의 범위는 0x00000000 ~ 0xFFFFFFFF 까지 인 것이다.

 

시스템 운영에 필요한 메모리, 운영체제는 커널 영역에 올라가 있다. 사용자가 운영체제가 올라가 있는 커널영역에 마음대로 접근할 수 있다면 시스템이 안정적으로 운용될 수 없기 때문에 사용자가 함부로 커널 영역에 접근할 수 없도록 메모리를 유저영역과 커널영역으로 나누어 사용하는 것이다. 나누는 크기는 운영체제마다 다르고, 설정에 따라 영역의 크기를 조정할 수 있다.

 

유저 메모리 영역의 구조는 다음과 같다.

먼저 메모리에 코드가 올라온다. C소스를 컴파일하면 어셈블리 코드로 바뀌는데 이 코드가 코드 영역에 올라가는 것이다. 주소는 32bit 시스템은 주로 0804~  로 시작되는 영역에 올라간다.

 

데이터 영역은 전역변수가 로드되는 영역으로 항상 동일한 메모리에 위치하게 된다. 만약 사용자가 입력하는 값이 전역변수로 정의되어 있으면 고정된 메모리 주소에 원하는 값을 쓸 수 있게 되어 익스플로잇에 활용될 가능성이 높아질 수 있다.

 

힙 영역은 동적메모리를 할당하여 사용하는 공간이다. 대표적인 메모리 할당 함수로는 malloc이 있다. malloc로 필요한 공간을 할당하면 힙 영역을 쓰고, 쓰다가 필요 없으면 free로 해제하면 된다. 이때 힙 영역에 어떤 값을 엄청 많이 할당하고 free해준후 이 공간을 재사용하면 익스플로잇에 활용될 수 있다. 이러한 기법을 UAF라 한다.

 

스택영역은 메모리의 가장 바닥부터 채워진다. 스택은 높은 주소에서 부터 거꾸로 자란다. 그래서 스택 영역의 주소는 보통 0xbfff 이런식이다.  스택에 계속 자라다가 커널 영역을 건드리면 안되기 때문이다. 스택 영역은 함수 인자나 지역변수들이 올라온다.

 

+ Recent posts