stack overrun

Programming/C/C++ 2014. 6. 19. 16:42

http://www.microsoft.com/korea/msdn/columns/contents/CodeSecure/secure05202002/default.aspx

 

메모리를 검색합니다. 
어떻게 szName 과 cbName이 유효하다는 것을 알게 되었습니까? 사용자가 올바른 값을 제공한다고 믿으십니까? 일반적으로 대답은 아니요입니다. 버퍼 크기가 올바른지 확인할 수 있는 간단한 방법은 메모리를 검색하는 것입니다. 다음 코드 조각은 코드의 디버그 버전에서 이를 수행할 수 있는 방법을 보여줍니다. 

void Function(char *szName, DWORD cbName) {
   char szBuff[MAX_NAME];
   
#ifdef _DEBUG

   // 검색
   memset(szBuff, 0x42, cbName);
#endif

   // szName 복사 및 사용
   if (cbName < MAX_NAME)
      strncpy(szBuff,szName,MAX_NAME-1);
}

이 코드에서는 대상 버퍼에 0x42 값을 씁니다. 버퍼를 복사하는 대신 이렇게 하는 이유가 의아할 것입니다. 대상 버퍼 끝에 알려진 고정된 값을 쓰면 소스 버퍼가 너무 클 경우 코드가 실패할 수 있습니다. 개발 프로세스 초기에 개발 버그를 찾을 수도 있습니다. 공격자의 악의적인 부분을 실행하는 대신 실패로 끝나는 것이 더 낫습니다. 이 때문에 공격자의 버퍼를 복사하지 않으려는 것입니다. 

참고   테스트 중에 버퍼 오버런을 가져오는 것을 도와주기 위해 디버그 빌드에서만 이를 수행해야 합니다. 

'Programming > C/C++' 카테고리의 다른 글

Memory Bandwidth  (0) 2014.06.30
비디오 메모리 구하기  (0) 2014.06.24
[WinAPI] 컴퓨터 각종 부품 정보 알아내기  (1) 2014.06.22
GlobalMemoryStatusEx  (0) 2014.06.22
operator new  (0) 2014.06.14