이 코드가 왜 버퍼 오버플로우에 약한지 설명해주세요
조회수 2610회
소스코드
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로 설정해야 되는 건가요?
1 답변
-
보통 대부분 컴파일러에서
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);
댓글 입력