/ POSTS

linux_0x06 Heap 구조(malloc, free)

Heap 구조(malloc, free)

안녕하세요. Sulla임돠.

이번 포스팅 부터는 Heap BOF에 대해서 찬찬히 알아가도록 하겠슴돠.

먼저 지금까지 알아봤던 Stack과 앞으로 알아갈 Heap에 대해서 간단하게 비교 해보도록 합죠.

[그림 6-1]

위 차이 말고도 여러 차이가 있습니다만 이정도만 짚고 넘어가도록 하겠습니다. 위 특징중 몇 가지 짚고 넘어가야할 내용이 있으니 조금더 알아보도록 하겠습니다.

먼저 “동적 메모리”라는 특징이 있습니다. Stack의 경우 메모리 공간이 정적으로 할당 됩니다. 반대로 Heap의 경우는 동적으로 메모리를 할당 받습니다.

또한 Stack의 경우 함수 종료 시 자동으로 해제되는 반면 Heap의 경우는 사용자가 직접 관리해야 합니다. 이 때 대표적으로 사용되는 함수가 메모리 할당은 malloc(), calloc(), realloc() 함수, 해제는 free() 함수를 대표적으로 사용합니다.

malloc() 함수를 사용해서 필요한 heap 영역을 할당 해주며, 다 쓰고 더이상 필요 없는 heap 영역은 free() 함수로 해제해야 하는 것이죠. 필요한 만큼 공간을 잡고 다쓰면 뺴야 되는것이죠.

한마디로 Heap 영역은 사용자가 동적으로 메모리 공간을 할당/해제 하는 영역입니다.

Heap 보는김이 조금 더 자세하게 보도록 하겠습니다

조금 더 자세한 Heap

엉덩…Heap을 자세히 보도록 하겠습니다. (언제나 그랬듯….필요한 내용만 쏙쏙 보도록 하겠습니다.)

위에서 malloc() 으로 메모리 공간을 동적으로 할당하고 다쓰고 필요없는 공간은 free()로 해제 하다고 했습죠.

그 내용을 한 번 자세히 보도록 하겠습니다.

[그림 6-2]

위 그림은 malloc()을 사용해 할당했을 경우의 모습을 보여줍니다. 그런데 chunk라는 모르는 이름이 보이는데 뭐하는 친구일까요??

chunk는 Heap에 할당되는 영역을 가리키는 이름입니다. 쉽게 말해 malloc() 함수로 할당하면 메모리의 Heap 영역에는 chunk라는 이름으로 할당 되는 것이지욥.

그럼 chunk가 어떻게 생겨먹었는지 보도록 하겠습니다.

[그림 6-3]

우선 malloc()으로 heap 영역에 chunk가 할당 되었을때입니다. chunk는 8byte 크기로 할당 받으며(64bit OS는 16byte) 위와 같은 모습을 하고 있습니다.

prev_size는 이전 chunk의 크기를 나타내주며 free() 시에 생성 됩니다. 당연히 첫 chunk는 이전 chunk가 없기에 0이 들어가있습니다.

size는 현재 chunk의 크기를 담고 있으며 malloc() 시에 생성 됩니다.

AMP는 플래그 필드이며 각 플래그는 아래와 같습니다.

A : NON_MAIN_ARENA multi thread application에서 각 thread 마다 다른 heap 영역을 사용하는 경우 현재 chunk가 main heap( arena)에 속하는지 여부를 나타냅니다. (main heap = 0 / mmap’d memory = 1)

M : IS_MMAPPED chunk 자체가 단일 mmap() 시스템 콜을 통해 할당되었을 때 셋팅 됩니다.

P : PREV_INUSE 이전 chunk의 상태를 나타내줍니다. (chunk using = 1 / chunk free = 0)

data는 실제로 데이터가 들어가는 영역입니다. 입력값이 들어간다 생각하면 편하겠습니다.

다음은 free()로 해제 되었을 때 모습을 보도록 하겠습니다.

[그림 6-4]

이전과 조금 달라진 모습이 보입니다. data영역이 fd/bk 라는 생소한 공간이 생겼습니다. 이름을 보고 대충 감이 오시는 분도 있을거라 생각 됩니다. forward / backward이 연상 되시는 분들이 있을거라 생각 되네요.

fd : (forward pointer) free된 다음 chunk를 가리킵니다. (data 영역의 앞 4byte)

bk : (backward pointer) free된 이전 chunk를 가리킵니다. (data 영역의 뒤 4byte)

fd/bk를 참조하여 free된 heap 영역을 확인하는 구조입니다. 또한 위에서 언급한 플래그 값도 변할 것입니다. (PREV_INUSE) 이제 fd/bk에 대해서 후에 해볼 공격 기법을 위해 미리 조금더 알아 보도록 하겠습니다.

[그림 6-5]

위에서 보았던 내용을 좀금 수정 해봤습니다. A~E 까지 malloc()으로 할당 해주고 A, C, E만 free()로 해제 한 상태입니다. 이때 fd/bk가 어떤 모냥인지 보도록 하겠습니다.

[그림 6-6]

A, C, E 가 free()로 해제 되면서 fd/bk는 위 그림과 같이 링크를 갖게 됩니다. 이것을 double linked list 라고 부르며 이 내용 또한 니중에 다시 다루게 될것입니다. 지금은 시작이기에 이런식으로 구성 되어있다는 정도만 알고 가시면 될 듯 합니다.

[그림 6-7]

지금까지 Heap 영역에 malloc()을 사용하여 할당 받을 경우와 free()를 통한 메모리 해제를 하는 경우 어떤 모습으로 진행 되는지를 알아봤습니다. 다음부터는 free()를 통한 해제를 하지 않을 경우 어떤 일이 생기는지 알아보도록 하겠습니다.

엉덩…Heap도 찬찬히 한 걸음씩 가보도록 하겠습니다.

고생하셨습니다. 담에 뵙겠숩니다욥!