오늘 분석한 자료는 이전 포스팅에서 다루었던 fastbin_dup을 이용하여
malloc으로 할당받는 주소를 우리가 원하는 주소로 할당받는 것이다.

이번 자료에서는 그 주소를 stack 영역의 주소로 할당받는 것이 목적이다.

fastbin_dup과 같이, free list가 a -> b -> a 이러한 상황을 만들어야한다.
같은 chunck를 free 2번 시킨 후 하나를 다시 malloc으로 받은 후 그 주소에 접근할 수 있으므로 다음 chunk를 가리키는 포인터를 조작하는 방법이다.

이 기술을 직접 사용하기 위해서는
free 3번(같은 chunk로 2번), malloc으로 double free한 chunk를 받아오거나 double free한 chunk에 접근 할 수 있는 상황과 그 조작한 chunk를 malloc 시킬 수 있는 상황이어야한다.
그렇다면 stack 주소뿐 아니라 다른 주소로도 malloc을 이용해 받을 수 있다.
(단, chunk의 구조체중 size 멤버가 적절해야한다.)

fastbin_dup_into_stack 자료를 분석해보자.

먼저 주소로 받을 위치는 stack_var의 주소이다.



(우리의 목적 주소)


여기서 +8을 해준 주소를 목적이라고 한 것은 heap의 chunk 구조를 보면 앞의 8바이트가 chunk size정보가 들어있는 위치이기 때문이다. 

먼저, fastbin_dup과 같이 3개의 malloc을 해준다.



(3개의 malloc)


fastbin을 이용할 것이기에 8바이트를 할당한다.
최소 16바이트이기 때문에 16바이트의 user data 영역이 생기고 8바이트의 size, 8바이트의 prev_size영역으로 총 32바이트, 총 chunk의 크기는 0x20일 것이다.

첫번째 free 해준다.



(첫번째 free)


그 후 바로 a를 free를 하면 free list 맨 위에 있는 a가 같으면 에러가 나므로

b를 free해준 뒤 a를 free해준다.



(free)


지금 까지의 상황은
free list의 top에는 a 주소가 들어있고,
a는 b를 가리키고 b는 a를 가리키는 a->b->a 의 상황이다.

여기서 malloc을 해주어 a의 주소를 d에 넣고, 다시 malloc을 해준다.




(malloc)


위의 코드까지 진행이 된다면
d의 주소에는 기존 a의 주소가 들어있고, 현재 free list의 top에는 이전 a의 주소(현재 d의 주소)가 들어있을 것이다.

free chunk list에 있는 chunk에 접근할 수 있다.
-> 이전 a의 주소(현재 d의 주소)가 free chunk list에 있고, d로 접근할 수 있기 때문에!

그렇다면 이제 우리가 할당받을 주소는 stack주소이기 때문에
stack 영역에 chunk라고 속일 수 있게 흉내를 내야한다.
우리가 malloc(8)을 사용하여 받을 것이기 때문에 총 청크 사이즈는 0x20이다.(위에 설명)

그렇기에 stack_var주소 위치에 0x20을 넣는다.




(chunk 총 크기)


그 후 chunk size영역의 크기는 8바이트 이전의 주소를 적어줘야한다.

그렇기에 d의 sizeof의 값이 8바이트이기에 sizeof(d)를 해주었다.



(fd 포인터 조작)


위의 과정까지 진행이 되면

메모리의 상황은 다음과 같다.



(메모리 상황)



위와 같이 fd 포인터 위치에 stack 주소가 들어가게 된다.

그 후 malloc을 해주게 되면 a의 주소가 할당 되고,
fd 포인터에 적혀있는 stack 주소로 넘어가 chunk size를 확인해보고 우리가 0x20으로 적어주었으므로 fastbin list에 들어가게 된다.

그러므로 free list의 top에는 이제 우리가 정한 stack 주소가 들어가게 되고

이번에 다시 malloc을 하게 되면 stack 주소가 반환되는 것이다.



(stack 주소 malloc)



(stack 주소 반환)


(* 위의 캡쳐 사진은 따로따로 찍은 것으로 gdb메모리 상황과 stack 주소 반환 결과가 같지 않다.)

'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  (0) 2018.01.04
(how2heap) - first_fit  (0) 2017.12.14

+ Recent posts