Dangling Pointer
1. Dangling Pointer
Dangling Pointer란, 할당된 메모리가 free 이후에도 해제된 메모리를 계속 가리키는 포인터를 의미한다.
따라서, 프로그램 개발 시 해당 포인터를 NULL 값으로 초기화하지 않는 경우 UAF 등의 버그가 발생할 수 있으며 이를 통해 노출되지 말아야할 정보가 노출되거나 DFB를 통한 임의 주소 메모리 할당 등의 행위가 가능해진다.
2. 예제 코드
코드 내에서
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(sizeof(int));
*ptr = 42;
printf("Before Free : *ptr = %d\n", *ptr);
free(ptr);
printf("After Free : *ptr : %d\n", *ptr);
ptr = NULL;
printf("After NULL : *ptr : %d\n", *ptr);
return 0;
}
코드 실행 시
free 전 : ptr 힙 주소의 메모리 값 출력
free 후 : ptr 힙 주소의 메모리 값 출력
NULL 후 : 에러 발생
3. 디버깅
동적 디버깅으로 어떠한 과정이 일어나는지 확인 해보자
1. malloc
할당된 chunk에 42 정수가 쓰여 있다
2. free -> tcache_put
tcache bin에 들어가고
safe linking
fd 위치엔 (&e->next >> 12) ^ tcache->entry[tc_idx]의 값이 암호화되어 들어가며
e->key 위치엔 랜덤을 통해 얻은 tcache_key 값이 들어간다
3. printf(*ptr)
해당 부분이 free 된 ptr 청크의 값을 출력해주는 부분인데
아직 rbp-0x8 위치에 heap 메모리 포인터가 저장되어 있으며
해당 위치를 인자로 printf를 출력해준다
ptr을 가리키는 포인터가 0x0으로 초기화 되지 않아 rbp-0x8 위치에 heap을 가리키는 포인터가 존재한다
rbp-0x8 위치를 인자로 printf 시 free 된 청크의 메모리 값을 읽을 수 있다
출력된 1431655769 값은 free 된 ptr 청크의 fd 값이다
힙을 가리키는 포인터를 NULL (0x0) 초기화하지 않았기에 해당 값을 출력시킬 수 있다.
4. ptr = NULL
해당 부분(rbp-0x8)이 heap 을 가리키는 포인터 위치이다
0x0(NULL)로 초기화되어 heap 메모리를 가리키는 포인터가 존재하지 않으므로 이제 free 된 heap을 참조할 수 없다.