C语言 如何触发和利用 CVE-2015-0235



我正在查看CVE-2015-0235(http://seclists.org/oss-sec/2015/q1/274)安全公告的一些案例研究和利用,但我无法弄清楚一些细节。对不起,如果它很明显。

在漏洞测试中,他生成了一个长度的字符串:

size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;

此字符串长度会导致大小检查通过,如他在"分析"部分中提到的,在求解来自size_needed大小临时缓冲区的strlen(name)

85       size_needed = (sizeof (*host_addr)
86                      + sizeof (*h_addr_ptrs) + strlen (name) + 1);

但是,在案例研究中,当他尝试多个程序时,他使用以下字符串长度:

[user () fedora-19-32b ~]$ /usr/sbin/clockdiff `python -c "print '0' * $((0x10000-16*1-2*4-1-4))"`

我猜0x10000来自调用非重入gethostbyname时的默认缓冲区大小。 16*1来自sizeof(unsigned char). 2*4来自 32 位计算机上的sizeof(char *)1用于空终止符。4从何而来?看起来他正在减去指针的大小,但这不会导致字符串正确放入临时缓冲区吗?该漏洞是因为size_needed遗漏了sizeof (*h_alias_ptr)

同样在开发部分,他描述了覆盖malloc块的size字段:

struct malloc_chunk {
  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */
  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;
  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
};

但是,由于仅溢出4个字节的限制(在32位机器上),他如何能够到达sizeprev_size不是他所能达到的吗?

GHOST.c 调用 gethostbyname_r():您将溢出的缓冲区及其在内存中的确切大小由调用方提供。您将溢出的几个字节将直接覆盖缓冲区后面的任何内容(GHOST.c 中的金丝雀)。

clockdiff 调用 gethostbyname():你将溢出的缓冲区是 malloc()ated,它在内存中的实际大小包括一个额外的size_t(size,在结构malloc_chunk中),也许还有一些填充(在 malloc.c 中 request2size()。您正在谈论的神秘的 4 个字节确保根本没有填充(否则您将溢出的几个字节可能会覆盖填充,仅此而已)。

相关内容

  • 没有找到相关文章

最新更新