-
-
[翻译]堆溢出技术:Malloc Maleficarum之The House of Spirit
-
发表于: 2017-3-7 20:40 3914
-
这个技术主要是有趣的,因为导致它的应用的是一个很自然的情况。这是 Malloc Maleficarum 中唯一可以用来利用堆栈溢出的堆利用技术。这是因为这个技术的第一步并不是去控制 chunk 的头部信息,而是控制传递给 free 的指针。这个指针是否在堆上并没有关系。
这个技术主要的想法是覆盖一个 malloc 返回的指针,然后传递给 free。从而导致链接任意的地址到 fastbin。之后的进行 malloc 调用可以使得这个任意地址被当作一个 chunk 被使用。如果我们可以控制应用如何使用那个虚假的 chunk,那么我们就很有可能覆盖可执行的数据。
假设我们已经控制了一个将要传递给 free 的指针。我们首要需要考虑的问题是我们应该将这个指针覆盖成什么?我们需要记住,这个技术最终的目的是使得我们可以通过返回一个任意地址的 chunk 来覆盖一些执行控制数据。执行控制数据是什么并不重要,只要溢出它可以导致执行流转移到我们可以控制的地方。有两个主要可以使用的例子是函数指针和函数返回地址。在此,我们将其称为目标。
为了成功地使用这个技术,我们需要在小于目标地址处控制一个字的值。这个值对应着传递给 free 的假 chunk 的头部的size字段。此外,假 chunk 的大小必须位于离 target 不超过 64 字节的地方。这是因为对于一个 fastbin entry 来说,默认的最大数据字节是 64,而且最后的 4 个字节是被要求用来覆盖目标的。
对于假 chunk 的数据来说,有一些要求,我们将会简单地说一下。对于现在,假设上面的条件都满足了,并且 free 作用在了一个合适的 fakechunk 上。Free函数会进行调用public_free():
在这种情况下,内存就是首先被溢出指向虚假chunk的值。这被转换为虚假chunk数据区对应的chunk,而且被传递给arena_for_chunk以便于可以找到对应的arena。为了避免作为一个mmap() chunk被特殊地对待,而且得到一个有意义的arena,虚假chunk的头部的size字段中的ISMMAPPED和NON_MAIN_ARENA位必须被清除。为了达到这个目标,我们可以简单的设置虚假的大小为8的倍数即可。这意味着内部的_int_free函数将会被执行:
这就是free函数中有关house of spirit的所有代码了。我们所控制的内存的值被再次转换为一个chunk,并且那个虚假的size值被提取出来了。由于size字段是我们可以控制的,我们可以确保该字段的值小于av->max_fast,默认是64+8,那么fastbin代码就可以被执行了。最后一个需要考虑的虚假chunk中的nextsize的完整性测试。
由于虚假chunk必须足够大以便于可以包含目标,nextsize必须在比目标地址高的地方。由于虚假chunk被放在一个fastbin中,nextsize必须被处理,这就意味着在比目标高的地址处必须还有另外一个我们控制的值。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!