![]() |
1
2
如果没有运行时注入额外的检查,我看不到显式布局版本是如何验证的。 无论如何 ,因为它允许您看到对非声明类型的对象的非空引用。 这样更安全:
没有被破坏的风险等,仍然只有一个领域。它不涉及任何有风险的代码等。特别是,它不会冒一些愚蠢的风险,比如:
另一个问题是,除非可以保证CPU模式,否则只能支持单个字段;偏移量0很容易,但如果需要多个字段并需要支持x86和x64,则会变得更复杂。 |
![]() |
2
3
你发现了一个循环孔,clr允许这样做,因为所有重叠的字段都是对象。任何会让您直接处理对象引用的内容都会被类型加载异常拒绝:
但是你可以通过给类字段来利用它。只要您只是读取字段值,就不会发生真正的错误,例如,您可以通过这种方式获取跟踪句柄的值。 但是,编写这些字段会导致执行异常。不过,如果您能正确猜测跟踪句柄的值,我认为这是一个漏洞。但实际使用已经足够接近零了。 |
![]() |
3
2
如果以不安全的方式对齐类型,运行时将引发
我猜——因为你可以用
看看 this page 其中详细介绍了C结构转换为IL的一些方式,您会注意到有许多内存布局支持内置于IL/CLR本身。 |
![]() |
4
1
由于垃圾收集器是非类型化的,并且只区分对象引用和普通位,重叠的引用不会混淆它。但是,虽然一个对象引用可以完全重叠另一个对象引用,但这是不可验证的,即不安全的(ECMA-335标准,第180页,II.10.7控制实例布局)。很容易构建一个程序,利用这种不可验证的能力以可怕的方式崩溃:
在这里,func调用从对象类的虚拟表的最后一个元素的前面加载一个函数指针。根据 this article 在vtbl后面有一个句柄表。将其视为函数指针会导致System.AccessViolationException。 |
![]() |
5
-1
我不知道有什么问题。此外,我怀疑微软会允许这种使用,如果它是危险的,在一个不明显的方式。 |
|
wavesinaroom · 断言结构向量长度 7 月前 |
![]() |
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 11 月前 |
![]() |
kamkow1 · 匿名结构的初始值设定项错误无效 1 年前 |