본문 바로가기
Systemhacking/Base info

Fastbin Double Free

by reindeer002 2021. 4. 4.
728x90

저번 시간에 이어 heap영역의 취약점을 이용하는 방법에 대해 알아보자.

필자의 pwndbg가 올바르게 작동하지 않아 bound7님의 자료를 참고하여 글을 포스팅함을 알린다.

(감사합니다 형님 꾸벅 (_ㅇ_) )

 

1. Libc leak Tech

Unsorted bins, Small bins, Large bins를 이용하여 main_arena의 주소를 알아내는 방법이다.

만약 Fastbins 이외의 사이즈를 할당한 후 Free하면 FD, BK영역에 main_arena 주소가 들어가는 것을 응용하는 것이다.

0x603420 위치에 main_arena가 들어간 모습

2. Fastbin duplicate(Double Free)

더블 프리 취약점이 있을 때 이용할 수 있는 기술로 우리가 원하는 곳에 원하는 값을 쓸 수 있는 방법 중 하나이다.

double free가 실행된 모습

이러한 취약점이 발생하는 이유는 fast top chunk와 지금 free 하려 하는 chunk가 동일한지만 검사하기 때문이다.

 

즉, 아래와 같은 상황에서

두 chunk가 서로를 가르키고 있는 모습
fastbin top

malloc 0x30 이후 0x603410 주소를 할당하고 0x603410에 값을 쓸 수 있게 된 것이다!

 

우리는 이 공간에 aaaaaaaa을 입력하였다고 가정하자!

malloc이후 다음 chunk인 0x603450이 top chunk로 올라온 모습
malloc받은 0x603410에 aaaaaaaa을 입력한 모습

 

그럼 데이터(aaaaaaaa)를 썼으니 malloc을 2번 더 사용하여 0x603410을 다시 한 번 할당받은 후

fast top이 0x6161616161616161(aaaaaaaa)을 가르키도록 만든다.

현재 fast top이 0x6161616161616161을 가르킴

 

이후 한번 더 malloc을 통해 메모리를 할당받으면 0x6161616161616161의 메모리를 할당받게 된다.

물론 이 경우 segmentation fault가 발생하지만 만약 이 부분에 printf_got, puts_got같은 got영역을 주면

got overwrite가 가능하겠다!

 

하지만...

 

Fastbin Size Check를 통과해야 우리가 원하는 got overwrite를 할 수 있겠다!

size영역을 검사하는 기능

 

즉, (fd로 사용할 곳의 주소) + 0x8 위치에 fastbins의 임의의 사이즈 값이 존재해야한다.

예를 들어 만약 __malloc_hook주변을 사용한다 할 때 __malloc_hook에서 fastbin size로 줄 수 있는 주소를 찾아야 한다.

 

이때 각 주소마다 MSB값이 주소 타겟이 된다(0x7f).

MSB는 대부분이 0x7f임

 

이런 식으로 위치를 계산해가며 0x7f값을 chunk의 size에 옮겨 사용한다(단, 더블 프리한 곳의 size가 0x70이어야 함).

이제 0x7ffff7dd1b10-0x30+0x8+0x5+0x10 위치부터 덮어쓸 수 있음

 

728x90

'Systemhacking > Base info' 카테고리의 다른 글

unsorted bin attack  (0) 2023.06.02
unsafe Unlink in heap  (0) 2022.11.07
Heap Base  (0) 2021.04.03
What is GOT & PLT  (0) 2021.01.24
Security Techniques 1.  (0) 2021.01.22

댓글