在《C和C++安全编码》一书中,作者提到:
“W^X策略允许内存段可写或可执行,但不能同时具备。该策略无法防止覆盖atexit()等需要在运行时既可写又可执行的目标。”
我的两个问题是:
atexit需要通过函数指针注册函数作为参数。由函数指针指向的函数可能已在当前程序中定义,链接器将找到该定义,或者运行时加载器将查找函数体。在任一情况下,我们都将知道函数定义。然后它只需要是可执行的。那么为什么atexit()的内存段需要在运行时既可写又可执行?
有没有C/C++专家能告诉我还有哪些其他类型的API具有此属性(在linux上限制范围)(在运行时可写且可执行)?