2011-08-10 2 views
2

getmodulefilenamew 함수는 두 번째 인수를이 경우 고정 된 크기의 버퍼로 허용하므로 거짓 긍정 (버퍼 오버플로)을 생성합니다.버퍼 오버 플로우 또는 오 탐지?

그러나 그 문서를 통해보고 : http://msdn.microsoft.com/en-us/library/ms683197%28v=vs.85%29.aspx

인용구 : 버퍼 모듈의 이름을 길게 너무 작은 경우, 문자열은 널 종료 문자, 함수, n 크기 반환하고 기능을 포함하여 n 크기의 문자가 잘립니다 마지막 오류를 ERROR_INSUFFICIENT_BUFFER로 설정합니다.

누군가 신뢰할 수있는 제 3자인 사람이이 문제를 거짓 긍정으로 확인하거나 거부 할 수 있습니까? 당신의 도움을 주셔서 감사합니다!

===

HMODULE applicationModule = GetModuleHandleW(NULL); 
WCHAR processName[MAX_PATH]; 
memset(processName, 0, sizeof(processName)); 
GetModuleFileNameW(applicationModule, processName, sizeof(processName)); 

===

문제 스캔 베라 코드 정적 분석기에 의해 제공되었다

GetModuleFileNameW 기능 라인이다.

+0

정적 검사 도구에 대해 이야기하고 있습니까? 어떤 것을 말하고 코드를 보여주십시오. 그렇지 않으면 의미있는 대답의 기회가 없습니다. –

+0

죄송합니다. 죄송합니다. 질문을 업데이트했습니다. –

답변

2

nSize에 대해 잘못된 값을 전달 중입니다. 바이트 수를 전달하지만 문자 수인 MAX_PATH을 전달해야합니다. 이러한 값은 와이드 문자가 2 바이트 크기이기 때문에 다릅니다.

그래, 코드에 오류가 있습니다. 모듈 이름이 충분히 길면 Windows는 260 자까지만 저장할 수있는 최대 520 자까지 쓸 수 있습니다.

+0

나는 이해한다. 버퍼가 단순히 사용 가능한 최대 크기 + null 문자로 잘 리기 때문에 버퍼 오버 플로우가 가능하지 않습니다. 누군가 의견을 말하고 승인해야합니다. 그런 질문에 괴롭히지 않아서 죄송합니다. –

+0

아니요, 버퍼 오버 플로우가 매우 가능합니다. 버퍼는 당신이 말하는 것보다 작습니다. 모듈 이름이 260 자보다 길면 버퍼 오버런이 발생합니다. –

+0

하지만 : "모듈 이름이 제공된 버퍼보다 ​​크면 함수가 버퍼에 nSize 문자를 쓰고 나머지 문자를 잘라냅니다." 예, 그런 경우에는 전체 이름 (260+)을 얻지는 않지만 이름 대신 잘린 이름이 표시됩니다. 이 설명서가 정확한지 이해 했습니까? –

관련 문제