1

我必须在我们的一个运行 glibc-2.9 的 64 位系统上验证漏洞。

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

上面的链接给出了一个脚本,当传递一个幻数时显然会导致任意代码执行。但是当我在我的系统上尝试它时,似乎什么都没有发生。难道我做错了什么?如果存在漏洞,系统会崩溃吗?如何检测是否是意外代码执行?

4

2 回答 2

4

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

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

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

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

于 2012-04-18T16:11:43.213 回答
1

如果您要在 64 位机器上遇到问题,您必须模仿原始代码,但提供一个数字来包装 64 位机器上的堆栈。提供的原始号码是:

1073741796

$ 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_as是一个size_tp是一个char *。因此,您必须能够malloc()拥有大量空间(几乎 4 EiB)。大多数人在他们的机器上没有足够的虚拟内存,即使有用于支持的磁盘空间,也无法做到这一点。现在,也许,只是也许,Linux 允许您过度提交(并让 OOM Killer 稍后突袭),但malloc()更有可能失败。

还有其他相关的功能会影响 32 位系统,但它无法影响 64 位系统(目前)。

如果您有机会在 64 位机器上重现它,您可能必须进行 32 位编译。然后,如果风在您身后,并且您拥有相关软件的适当旧版本,也许您可​​以复制它。

于 2012-04-23T06:57:20.870 回答