이 코드가 왜 버퍼 오버플로우에 약한지 설명해주세요


소스코드

int func(char* str)
{
   char buffer[100];
   unsigned short len = strlen(str);

   if(len >= 100)
   {
        return (-1);
   }

   strncpy(buffer,str,strlen(str));
   return 0;
}

발생하는 문제 및 실행환경

학교 과제로 나온 건데 이 코드가 왜 버퍼 오버플로우에 약한지 쓰래요 근데 저는 아무리 생각해도 모르겠어요. 혹시 short대신에 int로 설정해야 되는 건가요?

  • 2016년 02월 01일에 작성됨

조회수 290


1 답변


좋아요
0
싫어요
채택취소하기

보통 대부분 컴파일러에서 unsinged short의 최대값은 65535입니다. 때문에 이 코드에서 길이가 65535을 넘는 스트링이 들어올 경우 버퍼 오버플로우가 발생합니다. 또 버퍼 크기가 100인데 길이가 100이 넘는 스트링이 들어와서도 안 되겠지요.

strlen()의 return값을 저장할 때는 unsigned short대신 size_t를 써야 되고, 이 길이가 버퍼 길이 이상일 때 memcpy해야 합니다.

char buffer[100];
size_t len = strlen(str);
if (len >= sizeof(buffer) / sizeof(buffer[0]))  return -1;
memcpy(buffer, str, len + 1);
  • 2016년 02월 01일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close