如何使用 mingw 在代码块中的 exe 上启用 ASLR、DEP 和 SafeSEH?
Posted
技术标签:
【中文标题】如何使用 mingw 在代码块中的 exe 上启用 ASLR、DEP 和 SafeSEH?【英文标题】:How can I enable ASLR, DEP and SafeSEH on an exe in codeblocks using mingw? 【发布时间】:2022-01-20 01:23:00 【问题描述】:我曾尝试在 ASLR 的链接器选项中使用 -dynamicbase -pie
和 -e_mainCRTStartup
,但是当我在 ollydbg 中加载它时,它总是以 400000 加载
【问题讨论】:
这是由您的操作系统完成的,而不是在编译时完成的。如果我没听错的话。 Ollydbg 总是加载 400000 可能是因为它是代码地址而不是堆栈。如果您实时调试,您将看到每次堆栈是如何随机化的。 您确实需要通过在每个动态库和可执行文件上设置正确的标志来选择加入 Windows 上的 ASLR。还需要为可执行文件输出重定位表,而 MinGW 似乎不会在没有 hack 的情况下做到这一点 (--export-all-symbols
)。
【参考方案1】:
您可以使用-Wl,--nxcompat
启用 DEP。您也可以以同样的方式将--dynamicbase
传递给链接器,但遗憾的是它不会发出必要的重定位表。作为一种解决方法,您可以传递-Wl,--dynamicbase,--export-all-symbols
。像 main
这样的单个符号的显式 __declspec(dllexport)
也可以工作,这也是目前 Rust 编译器中使用的解决方法。 AFAIK,GCC 没有实现 SEH,所以你不会因为错过编译时健全性检查(SafeSEH)而错过任何东西。
【讨论】:
我最近通过--high-entropy-va
开关在 GNU 链接器中获得了对高熵 ASLR 的支持,但这还不是稳定版本。作为一种解决方法,可以通过editbin
实用程序在可执行文件/库上设置这些标志。以上是关于如何使用 mingw 在代码块中的 exe 上启用 ASLR、DEP 和 SafeSEH?的主要内容,如果未能解决你的问题,请参考以下文章