[기초] 메모리는 어떻게 구성되어있나

2019. 2. 20. 23:32System Hacking/System Hacking Knowledge & Techniques

안녕하세요!

오늘은 메모리 구조에 대해서 

간단하게 설명해보도록 하겠습니다!


시스템 해킹을 하기 위해선

이 메모리 구조와

작동 원리를 잘 알고 있어야 합니다!


[32bit CPU를 기준으로 합니다!]

[주소는 16진수로 표현되니!]

[0x00000000~0xFFFFFFFF의 범위를 갖습니다!]



우선 간단하게 프레임을 그려볼게요


<낮은 주소 0x00000000>

|          ( 기 계 어 )            |

|       코   드    영   역        |

-------------------------------

|   초기화 된 데이터 영역      |

-------------------------------

초기화 안된 데이터 영역    |

-------------------------------

|      힙(Heap)  영            |

-------------------------------

|    공유 라이브러리  영역     |

-------------------------------

|        스택(stack) 영역         |

|                                      |

-------------------------------

|        커  널   영    역         |

|                                     |

<높은 주소 0xFFFFFFF>



1. 코드영역 (기계어)


코드영역에는 저희가 입력한 소스코드가

기계어로 변환되어 저장됩니다!

C언어로 작성했든, python으로 작성했든

그게 다 결국에 기계어로 변환되어서

CPU가 알아들을 수 있는 명령어로

여기에 저장 됩니다!


2. 초기화된 데이터 영역

여기는 저희가 초기화를 한 데이터를

저장하는 곳입니다!


근데 이 영역은

전역변수(Global variable)와 정적변수(Static Variable)만

해당돼요!

지역변수는 스택영역이에요!!


※초기화가 뭔데?

ex) C언어의 경우

static int a=1;

static int b=0;

이렇게 변수를 선언하고 값을 넣은거요!


즉, 변수 선언을 하고 값까지 넣어준 

변수들이 있는 곳이 여기입니다!


3. 초기화 안된 데이터 영역

여기는 아까랑 다른게 

딱 하나 있습니다!


똑같이 전역변수,정적 변수만 해당되는데!

여기는 변수 선언만 했을 때!

이 영역에 해당 됩니다!


static int a;

static int b;


이따구로 선언만 하면 여기 영역에

환영인사를 받습니다 ㅎ


4. 힙(Heap) 영역


필요할 때 마다 

메모리 할당을 받아야 할 순간이 있죠?

그래서 동적 할당을 합니다!

흔히 malloc함수를 이용해서요!


그런 동적할당을 

이 Heap 영역에다가 합니다!


5. 공유 라이브러리 영역


자 여기는 메인 프로그램이 

사용하는 함수들의 백과사전이라고 보시면 됩니다!


저희가 C언어에서 사용하는

printf함수도 libc.so.6 사전 안에 들어가 있죠!


근데 이게 사전을 원하는 쪽만 찢어서

저장할 수 있는게 아니라

일단 조금이라도 사용하려면

사전(라이브러리) 전체를 이 영역에

담아야 합니다!


저희가  printf,scanf등을 사용한다면

그 함수들의 사전이 

이 영역에 적재되는 것 입니다!


6. Stack 영역

스택 영역은

함수의 호출과 관련된 정보들이

저장되는 곳입니다!


함수의 복귀주소, 지역변수, 인자, 환경변수등이

여기에 저장됩니다!


특히 제일 기초적인 버퍼오버플로우를 

이해하시려면 이 stack영역을

유심히 관찰하셔야 합니다!



간단히 설명드리자면!

스택 구조에서

   [ 버퍼 ]  

[EBP]

 [RET ADDRESS]


이렇게 있을 때 버퍼에 입력을 

엄청나게 많이 주면

입력값이 흘러넘쳐서

RET ADDRESS(복귀주소)에 영향을 줄 수 있거든요!


그리고 다른 영역과는 다르게 스택 영역만!

데이터 입력을

메모리가 높은 곳에서 낮은 곳으로 

넣습니다!


그 이유는 

1. 커널의 영역을 침범하지 않기 위해서

- 높은곳에서 낮은곳으로 향하면 

데이터를 아무리 입력해도 

커널 반대방향으로 

데이터가 쌓이기 때문!


2. 메모리 공간의 효율적 사용을 위해!


힙 -----> 공유 라이브러리 <---- 스택

힙은 낮은 곳-> 높은 곳

스택은 높은 곳-> 낮은 곳


그렇다고 합니다!


7. 커널영역


마지막으로 커널영역은

저희가 어떻게 건드릴 수가 없는 부분이에요!

RAM이 4기가라고 하면 

끝 쪽의 1기가 정도는 이 커널이 사용한다고 하네요!


커널은 운영체재와 관련된 것이여서 

저도 아직 잘 알지 못합니다!

 그냥 현재로썬 이렇게 구성되어 있다

정도로 아시면 될 것 같습니다!


자 이렇게 메모리 구조에 대해서 설명을 해 보았습니다!

좀 글이 길어서 한번씩 다시 천천히 보시면

도움 될 것 같습니다!


감사합니다!