Study/Linux

Dangling Pointer

sh711 2025. 4. 6. 15:21

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을 참조할 수 없다.