DFB(Double Free Bug)
1. Double Free bug?
Double Free Bug는 동일한 청크를 중복으로 해제할 때 생기는 버그이다
libc < 2.26
- tcache 없음, free된 메모리는 fastbin에 저장한다
- 같은 청크를 두 번 free하면 fastbin에 중복 삽입할 수 있다
→ Double Free Bug를 직접적으로 활용 가능하다
libc 2.26 ≤ libc < 2.29
- tcache가 도입되고 free된 메모리는 먼저 tcache에 저장한다
- tcache는 중복 삽입을 허용하므로 Double Free Bug를 그대로 사용할 수 있다
→ tcache poisoning 기법이 주요 공격 방식이다
libc ≥ 2.29
- tcache에 대한 Double Free 방어가 도입되어 중복 삽입을 차단한다
- Double Free Bug를 사용하려면 방어 로직을 우회해야 하며, 우회 기법이 필요하다
2. 예제 코드
1. 예제 코드
동적으로 힙을 할당하고 연속으로 해제하게 되면 double free bug가 발생한다
if (__builtin_expect (old == p, 0)
{
errstr = "double free or corruption (fasttop)";
goto errout;
}
double free 를 체크하는 함수가 있다
이전에 해제한 pointer 와 현재 해제하려는 pointer 가 같으면 오류를 발생시킨다
하지만 chunk1 을 해제하고 chunk2를 해제한 뒤 다시 chunk1을 해제하면
오류 검출을 우회할 수 있다
#include <stdio.h>
#include <malloc.h>
int main()
{
char *ptr = malloc(0x20);
char *ptr2 = malloc(0x20);
free(ptr);
free(ptr2);
free(ptr);
char *ptr3 = malloc(0x20);
char *ptr4 = malloc(0x20);
char *ptr5 = malloc(0x20);
fprintf(stderr, "ptr3 add : %p\n", ptr3);
fprintf(stderr, "ptr4 add : %p\n", ptr4);
fprintf(stderr, "ptr5 add : %p\n", ptr5);
}
ptr 을 해제하고 ptr2 를 해제한다
그 다음 다시 ptr 을 해제한다
old == ptr2 가 되고 p == ptr 이 되기 때문에 오류검출을 우회할 수 있다
2. Ubuntu 16.04 (glibc 2.23)
ptr3 과 ptr5 의 주소가 같은 것을 볼 수 있다
free를 한 뒤 heap을 살펴보자
fastbin에 0x1b5fc000이 두 번 들어가 있는 것을 볼 수 있다
2. Ubuntu 18.04 (glibc 2.27)
glibc 2.26 부터 tcache 가 도입되어 main arena 가 아닌 tcahce가 청크를 관리한다
glibc 2.27 의 tcache 는 double free에 대한 검증 로직이 없는 것으로 알려져 있지만
테스트 중인 glibc 2.27 의 버전은 Ubuntu GLIBC 2.27-3ubuntu1.6 으로 이후 버전에서 도입된 검증 로직이 적용되었다
→ 사실상 glibc 2.26 까지만 가능하다
'Hacking > Pwnable' 카테고리의 다른 글
Tcache dup (0) | 2025.05.20 |
---|---|
UAF (Use After Free) (0) | 2025.05.07 |
Heap - ptmalloc2 (glibc) (0) | 2025.04.03 |
Stack Pivoting (0) | 2025.04.02 |
SROP (x64) (0) | 2025.03.26 |