【问题标题】:Safe memory region for stack canaries堆栈金丝雀的安全内存区域
【发布时间】:2016-10-04 10:18:21
【问题描述】:

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

【问题讨论】:

  • 你不要把堆栈金丝雀放在fs:,你把它们放在堆栈上。
  • 是的,但是您将它们放在 fs 中的某个位置以检查正确的金丝雀值
  • @Corn:如果您在 Ira 的回答中编辑来自 cmets 的一些信息,您可以改进这个问题,就像这是一个学校项目,不一定要足够有效采用。并且通常要弄清楚重点是什么,以及您希望它如何工作。我认为你有一个很好的问题,如果你把它整理一下,它会让 stackoverflow 成为一个更好的网站,这样未来的读者就可以清楚地知道到底要问什么。 (即重新编辑您的问题,我可能会赞成它。:P 也许多个较小的段落?)

标签: function gcc memory assembly stack


【解决方案1】:

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

您是否建议使用可通过 FS 访问的伪堆栈指针与主堆栈保持“并行”伪堆栈?使用通过 FS 访问的线程本地存储很容易实现。但为什么?为什么不能将堆栈金丝雀放入为函数调用分配的堆栈中?

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

【讨论】:

  • 是的,你是对的。我实际上并没有考虑将金丝雀值放在每个堆栈帧的最底部。我会尝试一下,也许看看我是否还有其他问题。谢谢
  • 关于您的 gcc 堆栈金丝雀问题。是的,他们有一个,但堆栈金丝雀是全球性的 afaik。这意味着你对每个函数都有相同的值。我的实现对每个函数调用都有一个单独的金丝雀,这样更安全。然而,这是一项大学作业,实际上并不是要取代 gcc 的堆栈金丝雀
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多