일반적으로 변수들은 변수가 선언된 함수 밖으로 벗어나게 되면 변수가 소멸되게 된다
단 변수 앞에 static키워드를 붙여서 선언하게 되면 해당 함수 호출이 끝난 후에도 변수가 사라지지않고 재호출 되었을 시 그 값을 유지한채로 함수가 동작된다
Dangling Pointer란 malloc으로 할당한 포인터를 free한 후 다시 해당 주소값에 접근하려고 했을 때 발생된다
Dangling Pointer를 방지해주기 위한 기본적인 방법은 free를 한 후 해당 포인터에 NULL포인터를 넣어주는 것이다 그러나 이 방법은 해당주소를 가리키는 포인터가 여러개 존재할 경우 안전하지 않을수 있어 주의하며 코드를 작성해야 한다
Double free란 free를 한 후 같은 주소에 다시한번 free함수를 호출하였을때 발생하는 문제이다 일반적으로 free를 여러번 하는것은 문제가 없다고 생각할 수 있지만 Double free는 생각보다 큰 취약점을 야기할 수 있다
void * a = malloc(10);
void * b = malloc(10);
free(a);
free(b);
free(a); //double free!
void * c = malloc(10);
void * d = malloc(10);
void * e = malooc(10); //same as c
malloc을 하면 해당 메모리 크기만큼만 공간이 할당되는게 아니라 chunk라고 하는 메타데이터 영역도 같이 생성이되어진다 그안에 free된 chunk들을 모아놓은 리스트가 존재하는데 어떤 메모리가 free되면 bin에 추가되어 다음에 같은 사이즈의 할당이 될 경우 빠르게 재할당 할 수 있도록 한다 이 때 위의 코드와같이 a를 double free를 했을 경우 bin 리스트에 두번 추가되게 되는데 실제로 할당이 될때 c 와 e는 같은 메모리주소를 참조하게 되어 버그를 일으킬 수 있다 심지어 만약 공격자가 c 나 e중 하나를 컨트롤 할 수 있다면 핵심데이터를 유출하거나 공격자가 의도한 코드를 실행할 수 있다
그림 잘 그리시네요