오늘 분석한 자료는 fastbin_dup 이다.

분석에 앞서 fastbin을 알아보았다.
glibc의 heap 초기 할당은 Top Chunck에서 이루어진다. 

Top Chunk에서 필요한 양을 잘라서 할당해준다. 그 후 사용이 끝난 후에 free를 해주는데
이 free된 chunk들을 그냥 내비두면 엄청난 낭비일 것이다.

그렇기에 free된 chunk를 재사용하기 위해 bin구조로 관리를 하여 재할당 해준다.
bin 구조는 사이즈에 따라 small bin과 large bin으로 나뉜다.
그리고 특수한 목적에 따라 unsorted bin, fastbin 으로 더 나뉜다.

small bin은 512바이트 미만의 chunk들을 관리하는 bin이다. 최소 바이트 16바이트 부터 8바이트 단위로 분류한다.
이 small bin안에 fastbin이 있다.
small bin안에서 72바이트 미만의 chunk들을 fastbin으로 관리한다.
fastbin은 다른 bin들과 달리 single-linked list로 관리된다. 다른 bin들은 doubled-linked list로 관리된다.

fastbin의 특징은 이름과 같이 빠르게 재할당할 수 있다는 것이다. 원리는 다른 bin의 chunk들은 인접한 chunk가 free되면 병합하는 작업이 있는데 fastbin은 이러한 작업이 없다. 그렇기에 다른 bin과 달리 fd와 bk를 가지지 않는 single-linked list의 구조이다. 이러한 구조는 Internal Fragment를 발생시키지만 속도는 빠르다는 장점이 있다.




(fast bin 구조)


how2heap의 fastbin_dup은 fastbin의 특징을 이용해 double free 공격을 보여준다.

먼저 3개의 chunk를 할당한다.


(3개의 malloc 할당)


그 후 a를 free해준다.



(a chunk free)


double-free 공격이란 free를 같은 chunk를 2번 하는 것이다. 같은 chunk를 2번 free한 다는 것은 말이 안되고 가능하게 되면 free list에 같은 chunk가 중첩된것 2개 들어가게 되는 것이고 그렇게 되면 malloc으로 같은 주소를 여러번 받을 수 있다는 것이다.

그렇기에 바로 free(a)를 하게 되면 free-list의 top에 a의 주소가 있으므로 에러가 날 것이다.

대신 b를 free해준다.



(b chunk free)


그렇게 되면
free-list에 b -> a 이렇게 single linked list에 들어가있는 상황이다.

그러면 우리는 a를 다시 free시킬 수 있게 된다.



(a chunk 두번째 free)

지금 이 상황의 메모리를 보자



(메모리 상황)


fastbin에는 a -> b -> a 이렇게 들어있다. 그렇기에 a의 주소(6000)에 b의 주소(6020)가 들어있고,
b의 주소인 6020의 다음 노드는 6000 으로 설정되어 있는 것이다.

여기서 다시 3개의 malloc을 해보면 결과는 아래와 같이 a, b, a의 주소가 나오고 결과적으로 a의 주소가 두번 malloc이 되는 상황이 나온다.




(결과)

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

malloc의 사용가능 영역(HEAP)  (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
(how2heap) - first_fit  (0) 2017.12.14

+ Recent posts