GCC 嵌套函数:无需可执行栈的间接调用

Indirect Calling of Nested Functions on GCC Without Executable Stack

在 GCC 中调用嵌套函数通常依赖可执行栈,这在安全上存在隐患。虽然新版 GCC 17 已提供原生支持,但针对旧版本,我分享了一种巧妙的变通方案:通过解析编译器生成的 trampoline 代码,提取其中的静态链和代码地址,利用 __builtin_call_with_static_chain 实现直接调用。这种方法虽然仍会生成 trampoline,但配合 patchelf 清除可执行栈标记,即可在保留功能的同时消除安全风险。此外,我还探讨了将 trampoline 本身作为函数描述符进行“解释执行”的新思路,为旧版编译器环境下的安全回调提供了新的解决路径。

既然我们实际上从未调用过 trampoline,就可以再次将栈设置为不可执行,从而至少解决了该功能带来的安全顾虑。

同日更多故事

2026-08-29