SpiderMonkey内部每个对象都与一个由一个JSClass对象组成的组相关联。该JSClass含有的元素ClassOps,其中包含函数指针控制属性的方式添加,删除等。如果我们能够劫持这个函数指针,然后执行代码是一个完成的工作。

JIT 利用过程:

  1. 首先我们 Fake 的部分,应该是上图中的 Class 整个,就是 name 到 oOps

2.其次我们要劫持 cOps 中的 addProperty 函数的话,应该把后面的其他函数都设置位 0,只需要在 addProperty 填上我们强制让 Jit 编译的部分。

  1. Jit 编译了我们的跳板 shellcode ,这个shellcode 应该是用双精度浮点数来表示,也就是转成 double 类型的数据。
  1. 跳板 shellcode 的作用是把我们最后执行的带有真正功能的 shellcode 的内存页,变成 RWX 权限。
  1. 强制 Jit 编译的时候,我们可以写上我们动态搜索到的地址,具体做法:

    用 eval 函数来把整个需要 Jit 函数包裹起来。

6.我们在 jit 编译好的跳板 shellcode 中搜索我们的 shellcode 开头的时候,应该一页一页的进行搜索。不然一个dword进行搜索,jit 的代码会被初始化位 0xebebebeb。 所以,直接从 jit 的起始地址开始,复制一大段的内容到一个 Arraybuffer 中,在这个 Arraybuffer 中来搜索。