了解幽灵和内存寻址

时间:2018-01-08 19:42:07

标签: memory x86 spectre

首先是免责声明:我不打算破解任何人,我只是想在我自己的机器上看到该漏洞利用。

我在x64 Windows 10上编译了VS2017中的幽灵示例。

该示例在从其自己的进程内存中读取时有效,但如果我尝试从我的测试应用程序中读取,则只会获得零或其他类似字符的字符串。

测试应用:

#include "stdafx.h"
#include <string>
#include <iostream>

const char *gotroot = "The Magic Words are Squeamish Ossifrage.";

using namespace std;
int main()
{
    printf("%p",gotroot);

    string endd;
    cin >> endd;

    printf("%s", gotroot);
    return 0;
}

我启动应用程序并将地址复制到Spectre命令行,但我没有得到字符串。

我无法弄清楚Windows 10是否已经修补过了?

但是我也尝试过在Ubuntu 17.04中暂时没有更新,结果相同。

我的方法有问题吗?

1 个答案:

答案 0 :(得分:0)

幽灵是一个漏洞。我假设你提到的这个“幽灵命令行”是一些具体的实现/测试工具?它利用了什么目标分支?可能是内核中的间接分支,否则你只能在它正在攻击的目标程序的虚拟地址空间中给它地址。

因此,在映射所有物理内存的内核虚拟地址空间中,您需要目标进程正在使用的物理内存的内核地址。 (或者无论Windows做什么,我都会忘记。但它显然不同于Linux的简单地图 - 所有内存都采用1G大页面设计)。但是两者都使用虚拟地址空间的上半部分来表示内核地址。 Meltdown论文解释了内核如何/为什么映射所有内存(并且会将其全局映射,如果他们不需要在Intel CPU上使用Meltdown,则由页表中的用户/超级用户位保护.Meltdown会破坏该权限位但是内核会在它执行自己的代码的任何时候映射它,因此Spectre可以利用该映射。 Meltdown的解决方法是在运行用户空间代码时取消映射内核页面。幽灵欺骗CPU在内核模式下推测性地执行一些内核指令。

无论如何,这与您的进程在其自己的虚拟地址空间中使用的char*值不同。物理内存的同一页面全局映射到高地址,作为内核map-everything区域的一部分,并且(当您的进程正在执行时)也映射到低地址以供用户空间代码使用。这是你用%p看到的后一个地址。