【问题标题】:Variable stack size on stack overflow exception [duplicate]堆栈溢出异常的可变堆栈大小[重复]
【发布时间】:2021-04-07 18:38:07
【问题描述】:

我有一个针对 net5 的*控制台应用程序,代码如下:

Work();
void Work()
{
    Work();
}

它最终会抛出一个*Exception 并将最后一个已知的堆栈大小打印到控制台。以下是几次运行的结果:

32120
32113
32133
32127

当我以 .net 框架 4.8 为目标时,我也看到了堆栈大小的这种可变性。

我查看了ECMA-335 Standard: Common Language Infrastructure 并找到了这句话,关于*Exception“这个异常的确切时间和它发生的条件是特定于实现的”。 然后我发现了 ASLR(地址空间布局随机化),并认为 CLI 实现可能使用了类似的技术。

我的问题是,为什么会存在这种可变性,如果关闭了 ASLR,那么潜在的攻击如何起作用?

【问题讨论】:

  • 我一直认为 ASLR 随机化了栈/堆/...的基地址,而不是它们的大小,所以 ASLR 不应该改变程序的最大递归深度...但我不是真正的 .NET 运行时内部工作专家

标签: .net security aslr


【解决方案1】:

如果该位置没有足够的空间来扩展堆栈,ASLR 可能会限制堆栈的大小。

不要对*Exception 的时间做任何假设。任何时候由于深度递归而有命中它的风险,您应该在堆上使用自定义的Stack 对象并将您的代码转换为迭代形式。

【讨论】: