【发布时间】:2015-04-18 18:20:06
【问题描述】:
在“C 和 C++ 中的安全编码”中,作者提到,
“W^X 策略允许内存段是可写或可执行的,但不能两者兼而有之。该策略无法防止覆盖目标,例如 atexit() 要求的目标,这些目标需要在运行时可写和可执行。”
我有两个问题:
atexit 需要通过函数指针作为参数注册一个函数。函数指针指向的函数要么在当前程序中定义,链接器将在其中找到定义,要么运行时加载器将找到函数体。在任何一种情况下,我们都会知道函数定义。然后它只需要是可执行的。那么为什么 atexit() 的内存段需要在运行时可写和可执行呢?
任何 C/C++ 专家能否告诉我还有哪些其他类型的 API 具有此属性(在运行时可写且可执行)? (让我们将范围仅限于 linux)
【问题讨论】:
-
惰性 JITers 可能会使用 W|X 段。他们不应该,但他们很懒。
-
我同意你关于退出处理程序的观点。 指向 退出处理函数的指针列表需要是可写的,但不需要是可执行的。指向的函数需要是可执行的,但它们不需要在可写段中。
标签: c++ c linux security memory