堆栈金丝雀的安全内存区域



我想实现一个按函数调用堆栈的canary。因此,我必须使用一个(不太小)内存区域来放入金丝雀(根据初始金丝雀值检查金丝雀的堆栈值)。我已经看到gcc的堆栈保护器使用FS内存。在那里,它只需要一个非常小的内存区域(我认为它大约有5个整数大小)。我还读到,FS内存用于其他操作系统目的,因此我显然需要尽量不干扰这些目的。由于我正在实现一个按函数调用的金丝雀,我需要一个更大的内存(金丝雀有1个单词大,我应该能够容纳至少100个金丝雀)。总的来说,我很好奇我能把它们安全地放在哪里。

我认为您建议修改GCC来管理另一种堆栈金丝雀(它不是已经有了吗?)。

您是否建议保留一个与主堆栈"并行"的psuedo堆栈,并通过FS访问该psuedo栈指针?使用可通过FS访问的线程本地存储实现这一点已经足够容易了。但是为什么?为什么不能将堆栈金丝雀放在为函数调用分配的堆栈中?

我构建了一个具有堆栈金丝雀的编译器(与GCC无关)。它在每个堆栈帧的最底部分配空间来保存一个canary值(一个常量,但您可以将其设置为从函数定义派生的值)。由于编译器正在生成(函数调用/退出)代码,因此在函数进入时,它可以将canary常量写入堆栈帧,在退出时,它还可以针对堆栈中的canary,针对同一常量的立即值添加测试。不需要并行堆栈,也不需要FS或任何其他寄存器的任何特殊用途来以这种方式实现堆栈金丝雀。

最新更新