라떼는말이야

메모리와 OverFlow 개념 정리, strcpy와 strncpy의 차이점 본문

알고리즘/CS50

메모리와 OverFlow 개념 정리, strcpy와 strncpy의 차이점

MangBaam 2021. 3. 13. 10:00
반응형

www.notion.so/2-7f4d4fc32a394624a1fc9585e408bf2f

 

✔︎ 미션 2.

1. 미션 제목

www.notion.so

1. 미션 제목

메모리와 OverFlow 개념 정리

2. 지시문

  1. 수업에서 언급되었던 Heap overflow와 stack overflow에 대해서 어떤 경우에 발생이 되는지 서술해주세요.

  2. Strcpy와 strncpy의 차이점을 서술해보세요. (어떤 것을 추천하는지와 그 이유에 대해서 서술해주세요.)

3. 핵심 개념

#문자열복사 #string.h

 

나의 풀이

1) Heap overflow와 Stack overflow

컴퓨터 메모리는 크게 4가지 영

역으로 나뉘어진다.

  • 코드 영역 : 프로그램이 올라가는 영역 (=텍스트 영역). CPU는 이 영역에 저장된 명령어를 하나씩 가져가서 처리함.
  • 데이터 영역 : 전역 변수와 정적 변수가 할당되는 영역. 프로그램의 시작과 함께 할당되었다가 프로그램이 종료되면 소멸함.
  • 힙 영역 : 동적으로 메모리가 할당되는 영역. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨.
  • 스택 영역 : 지역 변수와 매개 변수가 저장되는 영역. 함수의 호출과 함께 할당되었다가 함수 호출이 완료되면 소멸함.

overflow란 사용 가능한 메모리 영역을 넘어설 때 발생하는 오류이다. 즉, 메모리 할당 가능한 영역보다 더 많은 메모리 할당을 하면 발생하게 된다.

 

문제는 이러한 특성을 이용해서 해킹 공격에 사용될 수 있다는 점이다. 이미 옛날부터 버퍼 오버플로우는 널리 알려졌지만 여전히 강력한 해킹 수단이 된다. 그로 인한 피해는 접근할 수 없어야 하는 데이터에 접근하거나 수정하거나 취득하거나 혹은 데이터가 삭제되는 경우가 발생할 수 있다.

 

이를 방지하기 위해서는 메모리의 한계를 검사하는 경계 검사를 철저히 하고 OS 커널 패치를 최신으로 유지하며 안전한 라이브러리 함수를 사용해야 한다.

 

2) strcpy와 strncpy

strcpy와 strncpy 두 함수 모두 문자열을 복사하는 함수이다.

 

차이점이 있다면 strcpy는 문자열 전체를 복사하는 함수이고, strncpy는 가운데 n이 number를 뜻하며 문자열을 복사할 때 n 만큼 복사하는 함수이다.

 

여기서 주의할 점이 있는데 strcpy는 문자열 전체를 복사하면서 종단문자(\0)까지 복사를 한다는 점이다. 즉, origin에 저장된 문자열을 dest에 저장하는 상황에서 dest가 20만큼의 크기를 가지고, 20만큼의 문자열이 입력되어 있는 상황에서 origin에 저장된 10만큼의 문자열을 복사하면 종단문자까지 복사되기 때문에 종단문자 이후에 저장되어 있던 문자열은 그대로 무시되게 되는 것입니다. (문자열은 종단문자가 나타나면 끝이라고 판단하니까요)

 

말 그래도 무시된 것이기 때문에 origin에 저장된 문자열 크기가 10이라고 했을 때 종단문자는 11번째 인덱스에 존재할 것이고, 11번째 인덱스에 다른 값을 덮어쓰면 무시되었던 문자열이 나타나게 됩니다.

 

strncpy도 주의할 점이 있습니다. ctrncpy는 1) 빈 배열에 전체를 복사하는 경우, 2) 꽉 차있는 배열에 전체를 복사하는 경우, 3) 꽉 차있는 배열에 일부만 복사하는 경우, 4) 빈 배열에 일부만 복사하는 경우를 생각해볼 수 있습니다.

 

1)과 3)은 프로그래머가 의도한 대로 복사가 잘 이루어 집니다. 그러나 2)의 경우 strcpy와 같이 종단문자까지 복사되어서 종단문자 이후에 저장되어 있던 문자열이 무시되게 됩니다. 4)의 경우에는 알 수 없는 오류가 발생할 수 있습니다. 2)와 4) 모두 종단문자 때문에 발생한 오류입니다.

 

4)는 빈 배열에 origin의 문자 전체가 복사되지 않으면 종단문자도 복사되지 않은 것이기 때문에 문자열의 끝을 알 수 없어서 오류가 발생하게 됩니다.

 

결론은 strcpy나 strncpy 어느 것을 사용하더라도 복사할 문자열과 복사 될 문자열의 크기를 잘 파악해야 하고, 종단문자를 잘 고려해야 합니다. 그래도 둘 중 하나의 함수를 추천하라고 한다면 strncpy를 추천하고 싶습니다. strncpy는 ctrcpy보다 더 많은 변수가 존재하지만 strcpy의 기능을 포함한 더 많은 기능을 구현할 수 있기 때문입니다. 하지만 그만큼 프로그래머의 주의가 필요하다고 생각합니다.

반응형
Comments