发新话题
打印

[转载]小心 _alloca

[转载]小心 _alloca

文章作者:Michael Howard

_alloca 函数可以在堆栈中分配动态内存。分配的空间将在调用函数退出时自动释放,而不只是在分配超出范围时释放。下面是使用 _alloca 的示例代码:

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 转换宏
您还应当小心某些调用 _alloca 的 ATL 字符串转换宏。这些宏包括 A2W、W2A 和 CW2CT 等。如果您的代码是服务器代码,则调用其中任何转换函数时都必须考虑数据的长度。这是不要轻易相信输入的又一个示例。如果攻击者向您的代码提供一个 10 MB 的字符串,便会摧毁堆栈并引发异常;或者如果未引发异常,则导致失败。所以千万不要这样做!

(part from the msdn column page
here is the original resource:
http://www.microsoft.com/china/m ... /secure08192002.asp)

TOP

发新话题