firefox数据结构
条评论SpiderMonkey内部每个对象都与一个由一个JSClass对象组成的组相关联。该JSClass含有的元素ClassOps,其中包含函数指针控制属性的方式添加,删除等。如果我们能够劫持这个函数指针,然后执行代码是一个完成的工作。
JIT 利用过程:
- 首先我们 Fake 的部分,应该是上图中的 Class 整个,就是 name 到 oOps
2.其次我们要劫持 cOps 中的 addProperty 函数的话,应该把后面的其他函数都设置位 0,只需要在 addProperty 填上我们强制让 Jit 编译的部分。
- Jit 编译了我们的跳板 shellcode ,这个shellcode 应该是用双精度浮点数来表示,也就是转成 double 类型的数据。
- 跳板 shellcode 的作用是把我们最后执行的带有真正功能的 shellcode 的内存页,变成 RWX 权限。
强制 Jit 编译的时候,我们可以写上我们动态搜索到的地址,具体做法:
用 eval 函数来把整个需要 Jit 函数包裹起来。
6.我们在 jit 编译好的跳板 shellcode 中搜索我们的 shellcode 开头的时候,应该一页一页的进行搜索。不然一个dword进行搜索,jit 的代码会被初始化位 0xebebebeb。 所以,直接从 jit 的起始地址开始,复制一大段的内容到一个 Arraybuffer 中,在这个 Arraybuffer 中来搜索。