2012-04-12 228 views
1

我必须验证运行glibc-2.9的64位系统上的漏洞。glibc fnmatch漏洞:如何揭露漏洞?

http://scarybeastsecurity.blogspot.in/2011/02/i-got-accidental-code-execution-via.html

上面的链接提供了一个脚本,当通过一个神奇的数字显然会导致任意代码执行。但是当我在我的系统上尝试它时,似乎没有任何事情发生。 我做错了什么?如果存在漏洞,系统是否会崩溃?如何检测是否意外执行代码?

+0

正在运行Ubuntu 9.04? – 2012-04-12 04:20:49

+0

不是。它是一个带有busybox的准系统linux 2.6.29.1包装盒。 – woodstok 2012-04-12 05:07:45

回答

1

如果您在64位计算机上遇到问题,则必须模拟原始代码,但提供了一个将堆栈包装到64位计算机上的数字。提供的原始数量为:

$ bc 
z=1073741796 
z+28 
1073741824 
(z+28)*4 
4294967296 
2^32 
4294967296 
quit 
$ 

所以,描述输入数目的一种方式是(ULONG_MAX - 112)/ 4

用于64位计算机的模拟数是4611686018427387876:

$ bc 
x=2^64 
x 
18446744073709551616 
y=x/4 
y 
4611686018427387904 
y-28 
4611686018427387876 
quit 
$ 

然而,站在这个工作的机会,你就必须修改报告代码使用strtroull()或类似的东西; atoi()通常限于32位整数,在上面的64位数字上没有用处。该代码还包含:

num_as = atoi(argv[1]); 
if (num_as < 5) { 
    errx(1, "Need 5."); 
} 
p = malloc(num_as); 

num_assize_tpchar *。所以,你必须能够为malloc()大量的空间(差不多4 EiB)。大多数人没有足够的虚拟内存在他们的机器上,即使有磁盘空间作为后盾,也要这样做。现在,也许,也许,Linux可能会让你过度提交(并且让OOM Killer在后面突袭),但malloc()更可能会失败。

还有其他一些与32位系统相关并影响64位系统(还)的功能。

如果您希望有机会在64位机器上重现它,您可能必须执行32位编译。那么,如果风在你身后,并且你有适当的旧版本的相关软件,也许你可以重现它。

4

如果您在64位计算机上运行,​​则该错误的原始情况不适用。正如你可以在Chris的博客中看到的,他使用的是32位Ubuntu 9.04系统。漏洞利用依赖于使堆栈指针绕过32位地址空间,导致堆栈损坏。

我试着在glibc 2.5的64位系统上快速尝试一下,但看到malloc()失败而不是崩溃。

$ ./a.out 3000000000 
a.out: malloc() failed. 

您问过如何识别意外的代码执行;在这里没有带有漏洞/有效载荷的玩具程序,我们希望看到SIGSEGV,SIGILL或SIGBUS,因为CPU试图“执行”堆栈的垃圾部分,显示为相应的错误来自shell的消息。

+0

那么这是否意味着漏洞利用在64位系统上无效,因为malloc限制了fnmatch之前的数量? – woodstok 2012-04-18 16:48:47

+1

如果你在[兼容模式](https:/ /)中运行[32位chroot](http://ubuntuforums.org/showthread.php?t=24575),我很好奇, /en.wikipedia.org/wiki/X86-64#Operating_modes),就像Ubuntu默认的那样。与当前不成功的运行并行,这将是非常有用的。 – MrGomez 2012-04-18 22:16:02

+0

我没有得到你 – woodstok 2012-04-19 04:54:14