void function(char *szData) {
PVOID p = _alloca(lstrlen(szData));
// 使用 p
}
假如攻击者提供一个比堆栈大小还要长的 szData,_alloca 会引发一个异常并导致应用程序停止。假如该代码位于服务器中,则情况会更糟。处理这种错误情况的正确方法是将对 _alloca 的调用打包在异常处理程序中,并在出现错误时重置堆栈。void function(char *szData) {
__try {
PVOID p = _alloca(lstrlen(szData));
// 使用 p
} __except ((EXCEPTION_STACK_OVERFLOW == GetExceptionCode()) ?
EXCEPTION_EXECUTE_HANDLER :
EXCEPTION_CONTINUE_SEARCH) {
_resetstKOFlw();
}
}
相关问题:ATL 转换宏void ShuffleAndUpdate(char *szName, char *szPwd,
DWord index,
DWORD d) {
DWORD dwArray[32];
ZeroMemory(dwArray,sizeof(dwArray));
BOOL fAllowaccess = FALSE;
if (IsValidUser(szName,szPwd)) {
fAllowAccess = TRUE;
ShuffleArray(dwArray,szName);
}
dwArray[index]= d;
if (fAllowAccess) {
// 执行某些敏感的操作
}
}
新闻热点
疑难解答