본문 바로가기

C++

Segmentation fault 사례5

[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