get_next_line

이민규·2023년 6월 7일
2

42seoul

목록 보기
5/24

get_next_line을 들어가기전에 알면 좋은 지식들


static 변수란

일반적으로 변수들은 변수가 선언된 함수 밖으로 벗어나게 되면 변수가 소멸되게 된다

일반적인 경우

단 변수 앞에 static키워드를 붙여서 선언하게 되면 해당 함수 호출이 끝난 후에도 변수가 사라지지않고 재호출 되었을 시 그 값을 유지한채로 함수가 동작된다

static변수를 사용하였을 경우


Dangling Pointer

Dangling Pointer란 malloc으로 할당한 포인터를 free한 후 다시 해당 주소값에 접근하려고 했을 때 발생된다

  • Dangling Pointer 접근 시 예측 불가능한 동작 발생 가능성 ↑
  • Dangling Pointer 접근 불가 시 Segmentaion fault 발생 가능성 ↑

Dangling Pointer를 방지해주기 위한 기본적인 방법은 free를 한 후 해당 포인터에 NULL포인터를 넣어주는 것이다 그러나 이 방법은 해당주소를 가리키는 포인터가 여러개 존재할 경우 안전하지 않을수 있어 주의하며 코드를 작성해야 한다


Double free

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중 하나를 컨트롤 할 수 있다면 핵심데이터를 유출하거나 공격자가 의도한 코드를 실행할 수 있다


👀 get_next_line 함수를 작성하면서 실제로 dangling pointer 와 double free문제를 겪었었다 할당했던 메모리들을 합치고 해제하는 과정에서 실수 할 여지가 많기때문에 메모리 할당과 해제하는 부분에서 주의해 코드를 작성해야한다

profile
프로그래머 희망자(휴직중)

2개의 댓글

comment-user-thumbnail
2023년 6월 7일

그림 잘 그리시네요

1개의 답글