首先是免责声明:我不打算破解任何人,我只是想在我自己的机器上看到该漏洞利用。
我在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中暂时没有更新,结果相同。
我的方法有问题吗?
答案 0 :(得分:0)
幽灵是一个漏洞。我假设你提到的这个“幽灵命令行”是一些具体的实现/测试工具?它利用了什么目标分支?可能是内核中的间接分支,否则你只能在它正在攻击的目标程序的虚拟地址空间中给它地址。
因此,在映射所有物理内存的内核虚拟地址空间中,您需要目标进程正在使用的物理内存的内核地址。 (或者无论Windows做什么,我都会忘记。但它显然不同于Linux的简单地图 - 所有内存都采用1G大页面设计)。但是两者都使用虚拟地址空间的上半部分来表示内核地址。 Meltdown论文解释了内核如何/为什么映射所有内存(并且会将其全局映射,如果他们不需要在Intel CPU上使用Meltdown,则由页表中的用户/超级用户位保护.Meltdown会破坏该权限位但是内核会在它执行自己的代码的任何时候映射它,因此Spectre可以利用该映射。 Meltdown的解决方法是在运行用户空间代码时取消映射内核页面。幽灵欺骗CPU在内核模式下推测性地执行一些内核指令。
无论如何,这与您的进程在其自己的虚拟地址空间中使用的char*
值不同。物理内存的同一页面全局映射到高地址,作为内核map-everything区域的一部分,并且(当您的进程正在执行时)也映射到低地址以供用户空间代码使用。这是你用%p
看到的后一个地址。