우리는 malloc을 이용해 heap영역의 메모리 주소를 할당 받는다.
우리가 할당받은 주소는 heap영역의 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크기만큼을 더 쓸 수 있다는 이야기이다.
우리가 할당받은 주소는 heap영역의 chunk(덩어리)이다. 실제 덩어리에서 우리가 사용할 수 있는 공간은 어느정도 일까?
간단하게 malloc으로 0x10과 0x18 사이즈로 두개를 할당받는 코드를 만들었다.
(테스트코드)
그리고 malloc_usable_size 함수로 사용가능한 크기를 확인해보았다.
(확인 결과)
gdb를 통해 메모리 모습을 확인해보았다.
(메모리 모습)
여기 나와있는 사이즈는 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 |