본문 바로가기

공부

힙 설명은 정말 별거없지만

상기시킬겸 유저영역과 커널영역을 다시 보기로 함.

일단 간단간단하게 핵심만 설명하자면..


0xFFFFFFFF (high)

kernel section

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

[stack section]

[shared library section]

[heap section]

[(uninitialized)data section]

[(initialized)data section]

[code section]

0x00000000 (low)


뭐 이렇게 생겼다고 한다.


코드영역은 말 그대로 프로그램 실행되면 opcode 올라가는 곳이고..


데이터 영역은 전역변수나 static같은 변수들이 할당됨

여기는 시작과 동시에 할당되고 프로그램이 종료가 되야 소멸함.


힙 영역은 malloc이나 calloc이나 realloc으로 할당된 공간임.

뭐 말 그대로 프로그래머가 할당시켜야 쓰이는 공간이라 생각하면 될 듯.


void* malloc(size_t size)


malloc은 저렇게 생김.


이게 할당된 주소를 void 포인터로 반환하는데, 메모리 할당해서 어떤 데이터가 쓰일지 예측 불가능하기 때문에


int *i = (int*) malloc (sizeof(int)); 이런식으로 개발자가 세팅하라고 그렇게 만든거임.



void* calloc(size_t elt_count, size_t elt_size)


calloc은 이렇게 생김. 


이건 그냥 malloc에 카운터가 생김. elt_size만큼의 공간을 elt_count개 할당하라는 의미.


malloc(sizeof(int)*2) 이런식으로도 가능한데 calloc(2, sizeof(int)) 이렇게도 된다는 소리


참고로 calloc은 malloc과는 다르게 할당된 공간을 전부 0으로 초기화함.



void* realloc(void* memblock, size_t size);


realloc은 요렇게 생김. 


이미 할당된 주소에 수정할 버퍼를 크기를 입력해주면 입력해준 크기로 버퍼 크기가 바뀜.


추가할당되는게아니라 변경되는거임. 


memblock에 할당된 주소를 넣고 size에 원하는 만큼의 사이즈를 입력하면 됨.




스택 영역은 함수 호출 시에 생성되는 변수들이 들어감. 

주로 리턴 주소, 함수 인자, 지역 변수, 환경 변수 등이 있음..

컴파일 타임에 크기가 결정되고 함수 종료되면 이 값들이 소멸함.


당연한거지만 스택 영역은 높은 주소에서 낮은 주소로 쌓이기 때문에 커널 영역으로 침범이 불가능함.




kernel section

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

env, argv strings

env, argv pointers

argc

stack(local var. ...)

shared library

heap(allocated area)

.bss(uninitialized data section)

.data(initialized data section)

.text(code section)

'공부' 카테고리의 다른 글

Une simple Exploitation de vulnérabilité Format String  (0) 2015.11.02
malloc chunk  (0) 2015.10.28
dynamic linker  (0) 2015.10.18
vdso  (0) 2015.10.17
함수 호출 과정, PLT와 GOT  (0) 2015.10.17