新增防护机制
1、free
1.1、tcache
通过注释可以看到新增的 key 是为了检测 double free 的。
e->key=tcache,这个 tcache 就是:
也就是 tcache_perthread_struct 的地址,在调试中也就是这里:
即:
循环遍历 tcache 链表上所有的 chunk 进行对比,所以 tcache 的 double free 挂了。但是由于 tcache 的特性,他的利用还是要比其他 bins 方便很多。
绕过方式:根据上图,只有当key和tcache相等时才会去判断是否double free(所以就是说并不是每一个free的chunk都会被检查是否是double free),而如果程序中正好有漏洞可以把 key 改了(包括但不限于UAF),就不满足判断,跳过这段检查了。
1.2、chunk extend
判断了 presize 和 要合并的 chunk 的 size 是否相同。(我记得在要合并得堆块里伪造chunk 头,然后 presize 和这个伪造得数据相同应该可以,具体以后再记)
2、malloc
2.1、unsorted bin
先是 2.23 的这部分的检查:
这是 2.29 的:
原本只是对 size 的一个检查,但是 2.29 里增加了:
ⅰ. 对下一个相邻 chunk 的 size 的检查
ⅱ. 对下一个相邻 chunk 的 prev_size 的检查
ⅲ. 检查 unsorted bin 链表的完整性,啊这。。。
ⅳ. 对下一个 chunk 的 prev_inuse 位进行检查。
这么多检查,感觉 unosorted bin attack 很难利用了。上面第三条在 2.28 中就进行了检查。
2.2、top chunk
增加了对 top chunk 的 size 的检查,遏制了 house of force 的攻击。