C 런타임 오류 R6035

Microsoft Visual C++ 런타임 라이브러리, 오류 R6035 - 이 애플리케이션의 모듈은 해당 보안 쿠키를 사용하는 함수가 활성 상태인 동안 모듈의 전역 보안 쿠키를 초기화합니다. 이전에 __security_init_cookie 호출합니다.

__security_init_cookie 전역 보안 쿠키를 처음 사용하기 전에 호출해야 합니다.

전역 보안 쿠키는 /GS(Buffer Security Check)로 컴파일된 코드 및 구조적 예외 처리를 사용하는 코드에서 버퍼 오버런 보호에 사용됩니다. 기본적으로 오버런으로 보호된 함수를 입력하면 쿠키가 스택에 배치되고 종료할 때 스택의 값이 전역 쿠키와 비교됩니다. 둘 사이의 차이는 버퍼 오버런이 발생했으며 프로그램이 즉시 종료되었음을 나타냅니다.

R6035 오류는 보호된 함수를 __security_init_cookie 입력한 후 호출이 발생했음을 나타냅니다. 실행을 계속하는 경우 스택의 쿠키가 더 이상 전역 쿠키와 일치하지 않으므로 가짜 버퍼 오버런이 검색됩니다.

다음 DLL 예제를 고려합니다. DLL 진입점은 링커 /ENTRY(진입점 기호) 옵션을 통해 DllEntryPoint로 설정됩니다. 일반적으로 전역 보안 쿠키를 초기화하는 CRT의 초기화를 무시하므로 DLL 자체가 호출 __security_init_cookie해야 합니다.

// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
   DllInitialize();
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

void DllInitialize() {
   __security_init_cookie();
}

이 예제에서는 DllEntryPoint가 구조적 예외 처리를 사용하므로 보안 쿠키를 사용하여 버퍼 오버런을 검색하기 때문에 오류 R6035를 생성합니다. DllInitialize가 호출되면 전역 보안 쿠키가 이미 스택에 배치되었습니다.

올바른 방법은 다음 예제에서 보여 집니다.

// Correct way to call __security_init_cookie
DllEntryPoint(...) {
   __security_init_cookie();
   DllEntryHelper();
}

void DllEntryHelper() {
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

이 경우 DllEntryPoint는 버퍼 오버런으로부터 보호되지 않습니다(로컬 문자열 버퍼가 없고 구조적 예외 처리를 사용하지 않음). 따라서 안전하게 호출 __security_init_cookie할 수 있습니다. 그런 다음 보호되는 도우미 함수를 호출합니다.

참고 항목

오류 메시지 R6035는 x86 디버그 CRT에서만 생성되며 구조적 예외 처리에 대해서만 생성되지만 조건은 모든 플랫폼 및 C++ EH와 같은 모든 형태의 예외 처리에 대한 오류입니다.

참고 항목

MSVC의 보안 기능