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) {
// 執行某些敏感的操作
}
}
新聞熱點
疑難解答