우리는 malloc을 이용해 heap영역의 메모리 주소를 할당 받는다.
우리가 할당받은 주소는 heap영역의 chunk(덩어리)이다. 실제 덩어리에서 우리가 사용할 수 있는 공간은 어느정도 일까?

간단하게 malloc으로 0x10과 0x18 사이즈로 두개를 할당받는 코드를 만들었다.


(테스트코드)


그리고 malloc_usable_size 함수로 사용가능한 크기를 확인해보았다.



(확인 결과)


확인 결과 두개의 주소 모두 0x18로 나왔다. 어떻게 된것일까?

gdb를 통해 메모리 모습을 확인해보았다.



(메모리 모습)


우리는 분명 0x10과 0x18의 크기로 메모리 할당을 요청했음에도 불구하고 실제로 chunk 사이즈를 보면 0x21로 두개의 chunk가 할당된 것을 볼 수 있다.
여기 나와있는 사이즈는 chunk의 실제 크기이다.

0x10으로 할당을 하면 위의 예시에서 6010 주소가 반환된다. 이 chunk의 헤더는 0x10크기를 가진다.
그렇기에 실제 chunk의 크기는 0x10 큰 사이즈이다. 그렇다면 0x20이 아닌 0x21인 이유는 마지막 3비트는 flag비트로 사용되기 때문이다.

다시 글의 주제로 돌아가서 실제 사용가능한 크기가 전부 0x18이라니.
이 이유는 우리가 0x10을 요청했을 경우 실제로 0x10크기의 영역이 잡힌다. 그 후에 다음 청크가 할당되었는데 이 때 다음 청크의 헤더 앞부분까지 실제로는 사용가능하다. 위 사진에서 빨간색 테두리만큼 실제로 데이터를 쓰기가 가능하다는 것이다.

이해하기 쉽게 정리하면 청크의 헤더는 0x10크기이다.
그 중 0x8 크기는 자신의 chunk 사이즈를 담고있고 그 앞의 0x8바이트는 
PREV_SIZE 영역으로 이전 chunk의 크기를 가지고 있는데, 
-> 이전 chunk가 사용중이라면 이 영역은 이전 chunk가 사용한다.
-> 이전 chunk가 사용중이지 않다면(free됬다면) 이 영역은 이전 chunk의 size를 가지고 있게 된다.
그렇기에 실제로 사용가능한 크기는 다음 chunk의 헤더 앞부분 0x8크기만큼을 더 쓸 수 있다는 이야기이다.

'Vulnerability_Tech > About Heap' 카테고리의 다른 글

(how2heap) - house of lore  (0) 2018.02.21
(how2heap) - poison null byte  (0) 2018.02.20
(how2heap) - house_of_spirit  (0) 2018.01.17
(how2heap) - unsafe_unlink  (0) 2018.01.13
(how2heap) - fastbin_dup_into_stack  (0) 2018.01.11

+ Recent posts