【发布时间】: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 运行时内部工作专家