gpt4 book ai didi

c - 在段错误期间是否访问了物理内存的其他部分?

转载 作者:太空宇宙 更新时间:2023-11-04 03:17:53 25 4
gpt4 key购买 nike

作为学习项目的一部分,我在 Spectre 和 Meltdown PoC 方面做了一些工作,以使自己对这个概念更加熟悉。我已经设法使用时钟计时器恢复了以前访问的数据,但现在我想知道它们实际上是如何从该点读取物理内存的。

这引出了我的问题:在很多 Spectre v1\v2 示例中,您可以阅读这段玩具代码示例:

if (x<y) {
z = array[x];
}

假设 x 等于:attacked_adress - adress_of_array,这将有效地导致 z 获得 attacked_adress 的值。

在这个例子中它很容易理解,但实际上他们怎么知道 attacked_address 长什么样?它是带有偏移量的虚拟地址,还是物理地址,他们如何设法找到“重要内存”首先位于何处?

最佳答案

In the example it's quite easy to understand, but in reality how do they even know what attacked_adress looks like ?

你是对的,Spectre 和 Meltdown 只是可能性,而不是现成的攻击。如果您知道从其他来源攻击的地址,Spectre 和 Meltdown 是获取数据的方法,即使使用浏览器也是如此。

Is it a virtual address with an offset, or a physical address, and how do they manage to find where is the "important memory" located in the first place ?

当然,它是一个虚拟地址,因为它都发生在用户空间程序中。但是在最近的内核补丁之前,我们有一个完整的内核空间映射到每个用户空间进程。这是为了加速系统调用,即只对每个系统调用进行特权上下文切换,而不是进程上下文切换。

因此,由于该设计和 Meltdown,可以在未打补丁的内核上从非特权用户空间应用程序(例如,浏览器)读取内核空间。

一般来说,最简单的攻击场景是针对具有旧内核的机器,它不使用地址随机化,即内核符号在任何运行特定内核版本的机器上都位于同一位置。基本上,我们在测试机器上运行特定内核,记下“重要内存地址”,然后使用这些地址在受害者机器上运行攻击。

看看我的基于 Spectre 的 Meltdown PoC(即二合一):https://github.com/berestovskyy/spectre-meltdown

它比 Specre 论文中的原始代码更简单易懂。它只有 99 行 C 语言(包括注释)。

它使用上述技术,即对于 Linux 3.13,它只是尝试读取预定义地址 0xffffffff81800040,这是位于内核空间的 linux_proc_banner 符号。它在内核为 3.13 的不同机器上无任何权限运行,并成功读取每台机器上的内核空间。

它是无害的,但只是一个微小的工作 PoC。

关于c - 在段错误期间是否访问了物理内存的其他部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49609055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com