我必須驗證運行glibc-2.9的64位系統上的漏洞。glibc fnmatch漏洞:如何揭露漏洞?
http://scarybeastsecurity.blogspot.in/2011/02/i-got-accidental-code-execution-via.html
上面的鏈接提供了一個腳本,當通過一個神奇的數字顯然會導致任意代碼執行。但是當我在我的系統上嘗試它時,似乎沒有任何事情發生。 我做錯了什麼?如果存在漏洞,系統是否會崩潰?如何檢測是否意外執行代碼?
我必須驗證運行glibc-2.9的64位系統上的漏洞。glibc fnmatch漏洞:如何揭露漏洞?
http://scarybeastsecurity.blogspot.in/2011/02/i-got-accidental-code-execution-via.html
上面的鏈接提供了一個腳本,當通過一個神奇的數字顯然會導致任意代碼執行。但是當我在我的系統上嘗試它時,似乎沒有任何事情發生。 我做錯了什麼?如果存在漏洞,系統是否會崩潰?如何檢測是否意外執行代碼?
如果您在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_as
是size_t
和p
是char *
。所以,你必須能夠爲malloc()
大量的空間(差不多4 EiB)。大多數人沒有足夠的虛擬內存在他們的機器上,即使有磁盤空間作爲後盾,也要這樣做。現在,也許,也許,Linux可能會讓你過度提交(並且讓OOM Killer在後面突襲),但malloc()
更可能會失敗。
還有其他一些與32位系統相關並影響64位系統(還)的功能。
如果您希望有機會在64位機器上重現它,您可能必須執行32位編譯。那麼,如果風在你身後,並且你有適當的舊版本的相關軟件,也許你可以重現它。
如果您在64位計算機上運行,則該錯誤的原始情況不適用。正如你可以在Chris的博客中看到的,他使用的是32位Ubuntu 9.04系統。漏洞利用依賴於使堆棧指針繞過32位地址空間,導致堆棧損壞。
我試着在glibc 2.5的64位系統上快速嘗試一下,但看到malloc()失敗而不是崩潰。
$ ./a.out 3000000000
a.out: malloc() failed.
您問過如何識別意外的代碼執行;在這裏沒有帶有漏洞/有效載荷的玩具程序,我們希望看到SIGSEGV,SIGILL或SIGBUS,因爲CPU試圖「執行」堆棧的垃圾部分,顯示爲相應的錯誤來自shell的消息。
那麼這是否意味着漏洞利用在64位系統上無效,因爲malloc限制了fnmatch之前的數量? – woodstok 2012-04-18 16:48:47
如果你在[兼容模式](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
我沒有得到你 – woodstok 2012-04-19 04:54:14
正在運行Ubuntu 9.04? – 2012-04-12 04:20:49
不是。它是一個帶有busybox的準系統linux 2.6.29.1包裝盒。 – woodstok 2012-04-12 05:07:45