본 글은 드림핵로드맵을 진행하면서 공부 이해를 돕기 위해 작성한 문서입니다.
Double Free Bug
이전 Heap 이해에 대한 글을 작성하면서 free 함수로 청크를 해제한다면
(리눅스의 경우) ptmalloc2가 tcache나 bins에 추가하여 관리한다고 학습했고
이후 malloc 함수로 비슷한 크기의 동적할당이 발생하면 연결리스트를 참고해 재할당해준다는 것까지 확인했습니다.
이러한 매커니즘을 기반으로 free를 두번 시도할 경우 발생하는 취약점이 DFG( Double Free Bug )입니다.
언뜻 생각한다면 두번 free를 한다고 어떠한 문제가 생기는가 할텐데
heap 메모리의 할당과 해제시 할당한 영역의 크기는 요청한 사이즈보다 크다는 것과
그 이유가 청크 사이즈와 이전, 다음 청크를 가르키는 fd와 bk가 있어서 라는 것을 기억해야 합니다.
( fd : 이전 청크 주소값 / bk : 다음 청크 주소값)
아래 코드를 예시로 살펴보면
void *a = malloc(0x10);
void *b = malloc(0x10);
free(a);
free(b);
free(a); //DFB
void *c = malloc(0x10);
void *d = malloc(0x10);
void *e = malloc(0x10);
a와 b가 할당한뒤 a -> b -> a 순으로 해제를했다면, unsorted chunk list에 들어가게되는데
a -> b -> a 순으로 위치하게되면서 (왼쪽)a의 bk는 b가 되고 b의 bk는 다시a가 되게됩니다.
a는 하나인데 리스트에서는 두개의 청크로 인식되고 c, d, e를 할당시
의도와 다르게 c와 e가 같은 메모리 공간을 점유하게 되는 버그가 발생하게 됩니다.
만약 c나 e를 사용자가 컨트롤 할수 있다면 함수포인터를 덮어씌워 공격자가 의도한 코드실행도 가능하게 하거나
c,d 까지만 할당한뒤 c를 조작하는 것으로 남아있는 a의 청크 조작이 가능해 fd와 bk를 덮어씌워
bin리스트를 조작해 공격자가 원하는 메모리 공간을 할당하도록 강제하는 것이 가능합니다
(unlink 매크로 공격 기법)
unlink 매크로 공격 기법이 성공하면 다음과 같은 공식이 성립되는데
fd + 12 = bk, bk + 8 = fd
위 공식을 이용해 원하는 주소에 원하는 값을 입력시키는 것도 가능합니다.
하지만 최근에는 보호기법이 glibc에 구현되면서 이를 우회하지 않으면 두번 해제 즉시
프로세스가 종료되게 되어있습니다.
보호 기법을 우회하는 공격기법은 관련 문제를 풀면서 정리하도록 하겠습니다.
Reference
1. https://dreamhack.io/lecture/courses/116
'Reference > Pwnable_Study' 카테고리의 다른 글
[Pwn] Overwrite _rtld_global (0) | 2023.04.01 |
---|---|
tcache double free bypass (0) | 2023.02.12 |
(Linux) Heap 구조 이해하기 1 (0) | 2023.01.17 |
OOB(Out of Bounds) 취약점 (1) | 2023.01.07 |
Pwndocker와 LD_PRELOAD, patchelf (libc 제공된 바이너리 문제) (0) | 2023.01.03 |