2

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

我已经在 x64 Windows 10 上的 VS2017 中编译了 Spectre 示例。

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

测试应用:

#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,结果相同。

我的方法有问题吗?

4

1 回答 1

0

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

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

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

于 2018-01-13T17:57:13.787 回答