2012-04-12 198 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