[1. 개요]
strncpy 사용 시, 버퍼 오버플로우 발생.
정확히는, strncpy 사용 시 마지막 3번째 인자의 계산 오류로 인해 발생한 문제임.
아래와 같은 코드의 문제점은?
#include <iostream>
#include <cstring>
#define max(a, b) ((a) > (b) ? (a) : (b))
int main()
{
char buf[512];
char buf2[512];
strcpy(buf2, "hello");
strncpy(buf, buf2, max(static_cast<int>(strlen(buf2)) - strlen("helloworld"), 0));
std::cout << buf << std::endl;
return 0;
}
// output
// 18446744073709551611
// Segmentation fault (core dumped)
바로, int 와 size_t 간 자료형의 연산이다.
size_t 는 64bit 프로그램에서 8바이트 자료형이므로,
strncpy 의 3번째 인자는 매우 큰 값을 갖게 된다.
여기까지는, 어떻게 보면 단순한 문제이지만 더 큰 문제는 버퍼 오버플로우로 인해 발생한 영향이다.
발생한 side effect 는 프로세스 간 공유되는 메모리를 침범한 문제로, 다른 프로세스도 영향을 받게 된 점이다.
이는 공유메모리 접근 권한이 잘못되어 있어서, read-only 로 open 해야 하는데,
write 권한도 있다보니 커널의 도움을 받지 못했다.
참조) https://testkernelv2.tistory.com/746
자료형 간 불일치 인해 strncpy 를 사용했어도 SIGSEGV 가 발생한 사항이었다.
[2. 기타]
스택 오버플로우 문제는 아니지만, 자료형과 값의 불일치로 인해 발생한 문제..
for (unsigned short i=0; i<70000; i++);
unsigned short 는 2byte 까지 표현가능하므로, 65535 를 넘어서는 순간 다시 0이 되어버림.
=> 결국 무한 루프 발생.
'C++' 카테고리의 다른 글
fsanitize 컴파일 옵션 (0) | 2025.07.02 |
---|---|
buffer overflow 사례1 (0) | 2025.06.26 |
Placement new (0) | 2025.05.28 |
wchar_t 사용에 관하여 [2] (0) | 2025.05.13 |
wchar_t 사용과 관련하여. (0) | 2025.05.12 |