通过调试我们可以看到,rax是数组b的基址,rdx是数组的偏移。漏洞点就在数组存在越界读写。 为了利用该漏洞,我们需要分析清楚该js解释器的数据结构,才能来进行读写。 分析数据结构,构造如下的poc var a = "This is a PoC!" System.print(a) var b = [1, 2, "aaaaa",[3,"ddddd"]]
Strcut obj_ptr{ long unkown; void *ptr1; void *ptr2; objbuffrer *ptr; int size; int size; } 我们在数组中声明的变量值为1和2,在堆中却为0x3ff0000000000000和0x4000000000000000,实际上是用浮点形式存储的。所以我们读写的数据都要按照浮点形式存储。
Struct objtype{ long type;//如果是double类型的为4,如果为其他类型的为5 union{ double value; obj_ptr* obj; }; } struct objstr{ int type; int padding; void* ptr1; void* ptr2; int some_val; int size; char[] contents; };
http://www.dengb.com/wzaq/1348083.htmlwww.dengb.comtruehttp://www.dengb.com/wzaq/1348083.htmlTechArticle从crash到getshell 0ctf2019_plang 详解, 这是0ctf中的一道题目,题目提供了一个poc文件 var a = This is a PoC! System.print(a) var b = [1, 2, 3] b[0x80000000] =…