2g内存装64位win7系统10系统能用读写内存吗

Win10 Edge浏览器从越界写到任意内存读写 - FreeBuf.COM | 关注黑客与极客
Win10 Edge浏览器从越界写到任意内存读写
共257793人围观
,发现 7 个不明物体
*本文原创作者:BoA,本文属FreeBuf原创奖励计划,未经许可禁止转载&
在刚刚发布的微软11月份安全更新中,比较幸运刷了两个Edge的脚本引擎漏洞,对微软的脚本引擎漏洞有一定的见解,所以打算写篇文章与大家分享一下。由于这两个漏洞修复时间比较短,所以选择一个比较旧的9月份的漏洞跟大家分享。
如果大家有什么问题,欢迎通过微博与我交流。
在9月份微软安全更新中,修复了一个chakra脚本引擎的类型混淆漏洞()。经过分析,该漏洞影响win10 x64平台的edge浏览器,攻击者经过精心构造的网页,可以在受害者机器上达到远程代码攻击的效果。(x64平台的利用实在比x86的难太多:( & )
0×0漏洞分析
由于chakra脚本引擎已经开源,所以可以从github上得到此次漏洞修复的代码如下(in JavascriptArray.cpp\MapHelper()):
漏洞的修复很简单,就是把原来的DirectSetItemAt函数变成SetItem,接下来重点分析这两个函数的区别。
以下是两者对应的源码:
DirectSetIteamAt并不是一个虚函数,默认调用对象是JavascriptArray类型,但是里面并没有对typeId进行任何判断。
如图,SetItem是一个虚函数,会根据调用的对象分别调用不同的SetItem实现(JavascriptNativeIntArray是JavascriptArray的子类)。而且在内部会对typeid进行判断。在漏洞代码中,假如newArr并不是JavascriptArray对象,而是其子类的对象,就会引发越界读的漏洞。根据源码分析与对比,最终构造的测试PoC如下:
由于此漏洞需要利用ES6的标准实现JS的类的继承,所以只会影响Edge比较新的版本,Edge的旧版本和IE11并不影响。
通过Proxy类构造畸形的y,当在MapHelper遍历y的prototype时候,会进入如下代码:
调用y类的constructor函数,也就是fake函数,用于创建newObj对象,也就是Array.prototype.map()函数即将返回的对象。在JS中,即使fake是一个类,但实际上它是一个函数,包括其他类Array等也是一个函数,当调用new fake()的时候实际上是进入了class fake中的[Symbol.species]函数中,换句话说,[Symbol.species]就是类fake的构造函数。但是有一个概念需要区分,因为fake是函数,所以它的constructor就是Function,这与[Symbol.species]是不同的一个概念。
在构造函数中,返回的对象是n[5],这是一个JavascriptNativeIntArray类,因此newObj指针指向的是一个JavascriptNativeIntArray类,并不是JavascriptArray类。再往下,避过其他if,最后进入如下代码:
newArr也就是上文提到的newObj,查看这个对象的typeId:
可以看到,JavascriptArray的typeId应该是0x1c,但是这里是0x1d。
0×1 Out Of Bound Write
在64位的edge中,JavascriptArray的每个element占用的内存大小是0×8字节,因为要保存双精度浮点数以及对象地址等信息,但是在JavascriptNativeIntArray中每个element占用的内存大小是0×4字节,如下图所示,调用DirectSetItemAt之前:
因此每次调用JavascriptArray的DirectSetItemAt会占用JavascriptNativeIntArray两个element的位置,调用一次DirectSetItemAt之后:
在mapHelper遍历的过程中,即使length没有发生越界,最终也必然会导致越界写的行为发生,因此此漏洞仅仅影响64位的edge浏览器。但是单单的越界写是不足够的,还需要满足两个条件最佳:
1. 可以控制越界写越多少界,例如我想越8字节时就8字节,16字节时就16字节。
解决方法:根据此漏洞的特性,通过控制y和n[5]数组的长度可以控制越界写的长度,当然还需要考虑内存对齐的细节。
2. 可以越过中间某些数据不写。例如有时候我们只想修改后面数组的长度,但是在长度之前有某些重要的字段,如果修改了就会导致edge的crash。
解决方法:首先查看漏洞附近的代码:
假如可以令这个HasItem返回false,就可以跳过中间我们不想覆盖的字段,方法也很简单,在数组中间某些index位置设置成null,如图:
至此,任意越界写已经实现,下一步就是通过越界写修改相邻IntArray的长度。
0×2 制造一个big_array
首先需要了解IntArray在内存中的数据结构:
图中框着的地方分别是length,segment,segment的size,和segment的length,只要把length,segment_size和segment_length覆盖了,就达到目的,而且中间重要的字段,例如虚函数地址等要跳过,不然会导致crash。而具体要覆盖的值可以通过双精度浮点型指定要覆盖的值,覆盖以后如图:
具体JS代码如下:
然后检验是否修改成功,并且保存这个数组的索引:
0×3 制造big_DataView
第一步通过heap feng shui把某个dataview放进big_array的后面:
然后以0×1034作为特征值,查找这个dataview的内存位置,然后修改对应的length:
检验是否成功,并且保存这个dataview的索引:
0×4 任意内存读写
在查找dataview的bytelength特征值的同时,保存dataview的buffer_address的地址的位置,保存下这个索引:
Dataview的内存结构,分别是bytelength和buffer_address
任意内存读:
把需要读的地址写入dataview的buffer_address,再读取这个dataview偏移0×0地方的数据。
同理任意内存写:
0×5 获取任意对象地址
最后一步,就是获取任意对象的地址,我的代码如下:
因为得到的big_array是n[6],所以把需要读取的obj放入n[7][0],再通过越界读获取n[7]的segment的地址,再通过任意地址读,读取segment地址+0×18和0x1c的数据,即可得到这个对象的地址。
0×6 后续
至此,该漏洞的详细原因分析和远程代码执行所需要的任意地址读写和获取任意对象地址已经全部成功,剩下的部分(bypass cfg/dep)有兴趣的同学可以尝试实现(tips:利用JIT in WARP Shader,文章针对x86,在x64上会有比较大难度)。
(当然还需要一个逃逸沙箱的漏洞结合,不过这是后话。)文章中也提到在x64上利用的可能性:
在x86上会存在很好利用的gadgets用于构造ROP:
但是在x64平台想要编译出比较好用的gadgets JIT code需要一点耐心去写webGL代码,而且在x64中参数是通过寄存器传递,这样对栈中的数据的控制难度就会加大。因此可以选择使用push rcx//pop rsp//retn这样的指令以控制rsp,然后通过精心构造的webGL代码可以构造出需要的gadgets。
*本文原创作者:BoA,本文属FreeBuf原创奖励计划,未经许可禁止转载
必须您当前尚未登录。
必须(保密)
这家伙太懒,还未填写个人描述!
关注我们 分享每日精选文章查看: 683|回复: 4
win10 64位系统内存读取问题
阅读权限90
结帖率: (1/1)
程序在win7 32位上面调试一切正常,然后到win10 64位的就读不出内存数据,ce可以读出来,到就读不出来了。
3.png (46.93 KB, 下载次数: 0)
20:30 上传
(74.93 KB, 下载次数: 0)
20:30 上传
post_newreply
阅读权限120
签到天数: 16 天
管理员权限运行
阅读权限90
结帖率: (1/1)
管理员权限运行
编译出来管理员运行也读不出来
阅读权限120
结帖率: (2/3)
读写命令有问题&&用超级模块
阅读权限50
结帖率: (0/1)
用api 读写
精易论坛 - 有你更精彩 /1
JS混淆处理,指纹算法,人机识别,滑动验证,让你深刻理解JS的加密与解密
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,QQ: ,邮箱:@b.qq.com
Powered by
粤公网安备 25请问win10专业版64位最大支持多大内存呢?_百度知道
请问win10专业版64位最大支持多大内存呢?
我有更好的答案
win10 64位家庭版最大识别128G,专业版、教育版和企业版最大识别2TB内存
采纳率:69%
来自团队:
64位理论上最大是2^64字节=18EB,约180亿GB(1EB=1024PB,1PB=1024TB,1TB=1024GB),实际没有这么大的内存,你插四个16g的内存条就是顶配了
本回答被网友采纳
最大支持128G的。秋叶系统 好用,而且非常流畅!!
翻译一下最佳答案微软官方网页上的结果是:WIN10 32位 不管什么版本,最大支持4G内存(如果你的电脑内存超过4G,转了32位的WIN10最多也只能使用4G,多余的内存就是完全放在那里浪费的)WIN10 64位 不同的版本不一样企业版 2TB教育版 2TB高级版 2TB家庭版 128GB而且只要是双核或者更多核心数的CPU,都是可以装64位WIN10的,建议看到本回答的所有用户都装WIN10 64位顺便说一下 WIN10 64位理论上比32位更安全
其他1条回答
为您推荐:
其他类似问题
win10的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。[1楼] &&系统世家网友 - 来自新疆乌鲁木齐市水磨沟区 电信
有32或64位的uwf吗?发一个好吗?谢谢了win10系统为硬件保留了4.6G的内存,新加的内存条完全没作用了,怎么办? 试过两个内存条调换一下位置,第一次开机没问题,第二次开机又变回去了,再调换一次也一样。也试过吧把内存最大打钩,还是没用。
Win7系统其实会“偷内存”,将部分内存容量用作“为硬件保留的内存”,2G的系统内存甚至可能被“偷”掉500MB以上。这些为硬件保留的内存可能会用于各种硬件,不...
检查内存条:用鼠标对准桌面电脑,右键点击,点对话框“属性”,会显示电脑资料,下方有内存条容量,如果你的电脑内存容量是512M及以下,可以加一个同容量或原来2倍容...
512内存条分牌子 DDRII现代最便宜310 金士顿410
DDR333的金士顿340左右
128M的显卡分好多阿主要是ATI的X300 X600 X700 ...
问题到是不大的,不出现死机和重起就还可以使用!你的问题就是两块内存工作时的时钟频率不能很好的匹配,虽然是一个品牌的266的和333的肯定跑不到一条路上,所以工作...
答: 方法一:安全模式登陆
1在安全模式登陆
电脑开机时,连续按F8键,从弹出菜单中用上下按键选择“安全模式”进入系统。
2等待登陆选择用户界面出现后,点选Admin...
答: 比如常见的网吧电脑用的就是无盘网络技术。
优点:资源共享,节省资金。
缺点:访问速度慢,容易中毒!
答: dos下,输入netsh winsock reset 回车后重起.
或开始--运行--输入cmd --确定--弹出窗口后输入netsh winsock rese...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415

我要回帖

更多关于 易语言64位内存读写 的文章

 

随机推荐