virtual/physical 地址在 Spectre 示例中如何工作?
How does virtual/physical addresses work in regards to the Spectre example?
我已经有几年没有编程了,但是由于对 Meltdown 和 Spectre 的大惊小怪,我安装了 VS2017 并从这个 pdf 编译了 Spectre 示例:https://spectreattack.com/spectre.pdf
但是我不知道 Spectre 示例在命令行上使用的地址是如何工作的?
我修改了代码以输出秘密字符串的指针地址,并在 Native Tools Shell 中用 cl 编译,它输出如下内容:
00007FF6CF2210F0
在示例的命令行中输入此地址,它会正确输出秘密字符串。
但是如果我用类似的字符串编写一个简单的程序并输出那个地址
然后将它提供给 Spectre 示例,在另一个 shell 中,我没有得到正确的字符串。
我一直在阅读有关虚拟地址与物理地址以及页面和偏移量的信息,但我完全迷失了。
所以问题是:
你会如何在 C 代码中计算指针的物理地址?
How would you in C code calculate the physical address of a pointer?
我带你去问关于计算由指针值表示的物理地址,而不是存储指针值的物理地址。无论如何,后者只是归结为前者。
但就C语言本身而言,你不要这样做。 C 从一开始就不承认物理内存和虚拟内存之间的区别,也没有必要这样做。这种区别是 OS 级别的硬件支持问题。因此,任何实现您所描述内容的技术都依赖于 C 实现和执行环境的细节。
Spectre 设法打破(部分)由虚拟内存提供的进程隔离可能是它最可怕的地方。
我已经有几年没有编程了,但是由于对 Meltdown 和 Spectre 的大惊小怪,我安装了 VS2017 并从这个 pdf 编译了 Spectre 示例:https://spectreattack.com/spectre.pdf
但是我不知道 Spectre 示例在命令行上使用的地址是如何工作的?
我修改了代码以输出秘密字符串的指针地址,并在 Native Tools Shell 中用 cl 编译,它输出如下内容:
00007FF6CF2210F0
在示例的命令行中输入此地址,它会正确输出秘密字符串。
但是如果我用类似的字符串编写一个简单的程序并输出那个地址 然后将它提供给 Spectre 示例,在另一个 shell 中,我没有得到正确的字符串。
我一直在阅读有关虚拟地址与物理地址以及页面和偏移量的信息,但我完全迷失了。
所以问题是:
你会如何在 C 代码中计算指针的物理地址?
How would you in C code calculate the physical address of a pointer?
我带你去问关于计算由指针值表示的物理地址,而不是存储指针值的物理地址。无论如何,后者只是归结为前者。
但就C语言本身而言,你不要这样做。 C 从一开始就不承认物理内存和虚拟内存之间的区别,也没有必要这样做。这种区别是 OS 级别的硬件支持问题。因此,任何实现您所描述内容的技术都依赖于 C 实现和执行环境的细节。
Spectre 设法打破(部分)由虚拟内存提供的进程隔离可能是它最可怕的地方。