gpt4 book ai didi

c - 需要可执行堆栈和堆内存

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:28 28 4
gpt4 key购买 nike

我们知道,让虚拟内存的堆栈和堆区域不可执行可以防止恶意代码(如shellcode)在内存中执行(该技术称为Data Execution Prevention)。而且,将恶意代码注入(inject)内存的最简单方法是溢出缓冲区。因此,使内存的这些区域不可执行有助于降低溢出攻击的严重性。

但是,还有许多其他技术可用于防止此类攻击,例如地址空间随机化、指针保护、使用金丝雀等。我认为大多数系统使用这些其他方法而不是使堆栈/堆内存不可执行。(如果我在这里错了请纠正我)

现在,我的问题是,是否有一些特定的操作或特殊情况要求内存的堆栈/堆部分是可执行的?

最佳答案

JIT 映射内存的可写和可执行区域,或者简单地mprotect 先前分配的内存以使其可执行。

GCC 过去需要一个依赖于系统的方法来标记堆栈的部分可执行文件以供其 trampoline 代码使用。这是 12 年前的事了,我不知道今天是怎么做到的。

许多系统上的动态链接还需要能够为运行时解析的函数调用写入跳转表。如果您想让跳转表在表更新之间不可写,这可能会非常昂贵。

通常,可以通过尝试强制执行内存可写或可执行但绝不能同时执行的策略来安全地解决这些问题。当需要完成写入时,可以将内存重新映射为可写,然后再次保护以使其可执行。它牺牲了一些性能(不是那么多)以获得更好的安全性和稍微复杂的代码。

关于c - 需要可执行堆栈和堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996936/

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