C에서 스택 스매싱 감지 오류
이 튜토리얼은 원인을 강조하고 C에서 stack smashing detected
오류를 해결합니다.
이 문제에 직면한 사람은 메모리 분할과 스택 레이아웃을 이해해야 합니다. C 프로그래밍에서 코딩하는 동안 이 오류의 원인을 식별하는 데 도움이 됩니다.
C에서 스택 스매싱 감지됨
오류
일반적으로 컴파일러(여기서 GCC 컴파일러에 대해 이야기하고 있음)는 버퍼 오버플로를 방지하기 위해 이 오류를 생성합니다. 버퍼 오버플로는 사용자 입력이 버퍼(임시 저장 영역)의 용량을 초과할 때마다 발생합니다.
이 경우 컴파일러는 stack smashing detected
라는 오류를 발생시킵니다. 사용자가 10자 이상을 입력하면 stack smashing detected
오류가 발생하는 다음 코드 스니펫을 참조하십시오.
예제 코드:
#include <stdio.h>
int main(int argc, char **argv) {
char array[10];
printf("Please enter your username.");
gets(array);
return 0;
}
이 오류는 버퍼 오버플로 및 스택 개념을 둘러싸고 있으므로 여기에서 메모리 분할 및 스택 레이아웃을 이해하는 것이 중요합니다.
버퍼 오버플로는 위험한 프로세스이므로 컴파일러는 이 오류를 방지하기 위해 다양한 보호 메커니즘의 이점을 얻습니다. 메커니즘 중 하나는 임의로 생성된 값인 카나리아로 알려져 있습니다.
컴파일러(GCC)는 알려진 값이 있는 보호 변수(카나리아라고 함)를 추가합니다. 버퍼가 오버플로되면 카나리아를 덮어씁니다.
또한 컴파일러는 알려진 값과 비교하여 스택이 손상된 것을 식별하고 스택 스매싱 감지됨
이라는 오류를 생성합니다.
버퍼 오버플로 방지 변수를 방지하고 통찰력을 얻기 위해 컴파일하는 동안 -fno-stack-protector
를 사용하여 GCC의 보호를 비활성화할 수 있습니다. 예를 들어 $ gcc -o 파일 이름 -fno-stack-protector
.
이런 식으로 잘못된 메모리 위치에 액세스하려고 시도하기 때문에 세그먼트 오류
오류가 발생할 가능성이 큽니다. fstack-protector
는 보안 기능이므로 릴리스 빌드에 대해 켜져 있어야 합니다.
C에서 스택 스매싱 감지됨
오류 수정
이제 이 오류를 수정하고 프로그램을 원활하게 실행하려면 어떻게 해야 할까요?
스택 프로텍터를 방지하는 것이 이 문제에 대한 해결책이라고 말할 수는 없지만 이 오류를 수정하는 데 사용할 수 있는 통찰력을 찾는 데 도움이 됩니다. 또한 디버거로 프로그램을 실행하여 오버플로의 원인에 대한 세부 정보를 얻을 수 있습니다.
Valgrind는 스택 관련 문제 및 오류와 잘 작동하지 않지만 디버거는 충돌의 원인과 위치를 정확히 찾아내는 데 도움이 될 수 있습니다. 버그가 있는 코드를 찾아 수정하여 심각한 보안 취약성을 방지하십시오.