WEB开发网
开发学院软件开发VC 解决两个难懂的安全性问题 阅读

解决两个难懂的安全性问题

 2009-03-09 20:02:25 来源:WEB开发网   
核心提示: CreateService,并且 dwServiceType & SERVICE_INTERACTIVE_PROCESS == SERVICE_INTERACTIVE_PROCESS调用 MessageBox(),解决两个难懂的安全性问题(2),其中 uType and (MB_DEFAU

CreateService,并且 dwServiceType & SERVICE_INTERACTIVE_PROCESS == SERVICE_INTERACTIVE_PROCESS

调用 MessageBox(),其中 uType and (MB_DEFAULT_DESKTOP_ONLY | MB_SERVICE_NOTIFICATION | MB_SERVICE_NOTIFICATION_NT3X) != 0

调用 OpenDesktop("winsta0",...) 并在该桌面上创建用户界面

在 OpenDesktop 上调用 LoadLibrary/GetProcAddress

小心 _alloca

_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 的字符串,便会摧毁堆栈并引发异常;或者如果未引发异常,则导致失败。所以千万不要这样做!

Tags:解决 两个 难懂

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接