gpt4 book ai didi

c++ - 如何在 Windows 上报告堆栈缓冲区溢出?

转载 作者:可可西里 更新时间:2023-11-01 17:44:46 28 4
gpt4 key购买 nike

在下面显示的代码中,我使用了所有记录的方法来检测异常并生成诊断。它使用 C++ try/catch 关键字,使用 __try/__catch 扩展关键字捕获 SEH 异常,使用 Windows 的 AddVectoredExceptionHandler() 和 SetUnhandledExceptionFilter() winapi 函数来安装 VEH/SEH 过滤器。

使用 Visual C++ 2003 运行:
/GS:输出“你好,世界!”并以退出代码 0 终止。
/GS-:输出“你好,世界!”并以退出代码 0 终止。

使用 Visual C++ 2013 运行:
/GS:无输出,以退出代码 -1073740791 终止
/GS-:输出“你好,世界!”并以 0 退出结束。

如何在/GS 有效的 VS2013 编译程序中生成诊断?

#include "stdafx.h"
#include <Windows.h>

#define CALL_FIRST 1
#define CALL_LAST 0

LONG WINAPI MyVectoredHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
UNREFERENCED_PARAMETER(ExceptionInfo);

printf("MyVectoredHandler\n");
return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI MyUnhandledExceptionFilter(_In_ struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf("SetUnhandledExceptionFilter\n");

return EXCEPTION_CONTINUE_SEARCH;
}

void f()
{
__try
{
char p[20] = "hello,world!";
p[24] = '!';
printf("%s\n", p);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("f() exception\n");
}
}

int _tmain(int argc, _TCHAR* argv[])
{
AddVectoredExceptionHandler(CALL_FIRST, MyVectoredHandler);
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

try{
f();
}
catch (...){
printf("catched f exception\n");
}
return 0;
}

最佳答案

处理堆栈缓冲区溢出检测的 CRT 函数 __report_gsfailure() 假定堆栈帧损坏是由恶意软件攻击引起的。此类恶意软件通常会与 fs:[0] SEH 异常过滤器(存储在堆栈帧中)混淆,以获得异常处理程序来触发恶意软件负载。将数据转化为可执行代码的方法之一。

因此 CRT 函数不能假设抛出异常是安全的。不再在 VS2013 附带的 CRT 中执行,返回到 ~VS2005。如果操作系统支持它,它将快速失败,如果不支持,则确保已注册的 VEH/SEH 异常处理程序也看不到异常。 Kaboom,除非您附加了调试器,否则会在没有诊断的情况下崩溃到桌面。

/SAFESEH 选项可以阻止这种恶意软件攻击,因此它不像以前那样严重。如果您的代码仍处于堆栈损坏错误的阶段,并且您的应用程序还不够流行,无法成为恶意软件的目标,那么您可以考虑更换 CRT 函数。

请务必与您的主管讨论此事,考虑到您的客户承担的巨大责任,您永远不想为此承担个人责任。历史很少讲述一位程序员的遭遇,他的代码让整个公司停业一个月。但肯定不是什么漂亮的东西。

将此代码粘贴到靠近 main() 函数的位置:

__declspec(noreturn) extern "C"
void __cdecl __report_gsfailure() {
RaiseException(STATUS_STACK_BUFFER_OVERRUN, EXCEPTION_NONCONTINUABLE, 0, nullptr);
}

并计划很快再次删除它。

关于c++ - 如何在 Windows 上报告堆栈缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428375/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com