gpt4 book ai didi

c++ - 什么 SAFESEH :NO option actually do

转载 作者:可可西里 更新时间:2023-11-01 16:34:28 26 4
gpt4 key购买 nike

我正在尝试使用 boost::asio::spawn 函数,就像在 example 中一样,但它在 Release 中给我以下错误:

libboost_context-vc120-mt-s-1_55.lib(jump_i386_ms_pe_masm.obj) : error LNK2026: module unsafe for SAFESEH image

很明显,我应该在项目设置中设置 /SAFESEH:NO 选项,但我不明白这实际上会做什么。这如何影响程序中异常处理的行为(C++ 异常和 SEH)?

顺便说一句,我正在使用 MSVC-12.0。

最佳答案

简短回答:禁用 SafeSEH 会降低您的程序安全性


详情:SafeSEH是编译器保护。

在 Windows 环境中 SEH(结构化 Exception Handler)记录布局如下

Stack data (pointed by TEB - thread environment block)
|
| I) Pointer to next SEH record II
| EH pointer
|
| II) Pointer to next SEH record III
| EH pointer
|
| 0xFFFFFF
| default EH (MSVCRT)

通常基于 SEH 的攻击依赖于覆盖上述记录之一并让应用程序抛出异常:这将绕过控制流到您的代码(我没有考虑 DEP/ASLR 保护系统在这里,所以我假设一个已知的 +X 位置)。更准确地说,他们经常“模拟 EH 返回”,并获取下一个“恶意制作”的指针以跳转到 shellcode。

SafeSEH 的工作原理是指示操作系统在跳转到它们之前首先检查处理程序指针的有效性(对照已知有效 EH 的表)。此过程有一些限制,在特殊情况下,应用程序可能仍然容易受到攻击,但不太可能发生基于 SEH 的攻击(或更难制作)。

当针对非 safeSEH 编译模块进行链接时,链接器将无法生成 EH 位置的“可信表”(它根本无法判断这些 EH 的位置和是否有效),因此会出现错误。

Windows 操作系统工程的一些后勤限制、兼容性原因以及控制地址超出加载模块(和可执行镜像)范围的问题导致选择默认禁用此选项并让用户选择是否启用。

如果您的应用程序迫切需要安全性并且您将上述情况视为潜在威胁,则您应该启用它并重新编译您的模块以便使用它。

关于c++ - 什么 SAFESEH :NO option actually do,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25081033/

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