【发布时间】:2018-09-13 03:57:02
【问题描述】:
我在linux上玩了很长时间的二进制利用,最近我正在写一些基于ptmalloc的堆利用笔记,所以我回去查看一些过去安全的payload我已经解决的挑战,令人惊讶的是,它们不再起作用了。
比如基本的double free 损坏(不是fastbin)
char *chunk1 = malloc(0xc0);
free(chunk1);
free(chunk1);
我希望看到类似的东西
*** Error in `main': double free or corruption (top): 0x0000000000c85010 ***
但是没有,什么都没有发生,程序正常退出。
为此我去查看我的机器对应的glibc源代码-Debian GLIBC 2.27-2,发现malloc.c有很大的不同。
void *
__libc_malloc (size_t bytes)
{
...
#if USE_TCACHE
/* int_free also calls request2size, be careful to not pad twice. */
size_t tbytes;
checked_request2size (bytes, tbytes);
size_t tc_idx = csize2tidx (tbytes);
MAYBE_INIT_TCACHE ();
DIAG_PUSH_NEEDS_COMMENT;
if (tc_idx < mp_.tcache_bins
/*&& tc_idx < TCACHE_MAX_BINS*/ /* to appease gcc */
&& tcache
&& tcache->entries[tc_idx] != NULL)
{
return tcache_get (tc_idx);
}
DIAG_POP_NEEDS_COMMENT;
#endif
USE_TCACHE 也出现在许多其他地方。
然后我回到上面的程序,发现chunk1 没有放在small bin 中,而是放在tcache_entry 中。
TCACHE 的目的是什么?我搜索了很多,仍然感到困惑。
【问题讨论】:
-
快速谷歌搜索提示
per thread cache。我猜这个malloc实现为每个线程保留了一个较小的、不同大小的预分配块池。这样就可以在没有锁的情况下满足许多调用。 -
欢迎来到漏洞利用的世界。每个漏洞利用都必须针对
malloc()的特定实现进行定制——不同的实现有不同的漏洞,对一个人有效的不一定适用于其他人。 -
真正的问题不是为什么您使用的工具不再检测到双重释放吗? (可能是因为 malloc() 是从 tcache 提供的)
-
@Flow 不,实际上我已经弄清楚了 tcache 漏洞利用的工作原理,简而言之,它放弃了自 glibc 2.26 以来的许多安全检查(就像我的问题中的情况一样),许多漏洞利用变得更加强大。
标签: c malloc heap-memory glibc heap-corruption