2010-05-26 33 views
16

有沒有人有如何整數可以被利用的詳細解釋?我一直在閱讀很多關於這個概念的知識,並且我理解它是什麼,並且我理解緩衝區溢出問題,但我不明白如何可靠地修改內存,或者修改應用程序流程的方式,通過使整數大於其定義的內存....整數溢出如何被利用?

+0

一個[不涉及數組/內存操作的可能漏洞](http://news.cnet.com/8301-17852_3-57341753-71/man-wins-$57-million-casino-says-software- glitch /)。他獲勝的金額爲4300萬歐元,可疑接近我們都熟悉的2^32 = 4294967296,並且高度暗示可能是整數下溢引起的小故障。 – 2012-12-15 11:58:45

回答

14

這絕對是可利用的,但取決於當然的情況。

舊版本的ssh有一個整數溢出,可以被遠程利用。漏洞利用導致ssh守護進程創建一個大小爲零的哈希表,並在嘗試在其中存儲一些值時覆蓋內存。

上的SSH整數溢出更多細節:整數溢出http://www.kb.cert.org/vuls/id/945216

更多細節:http://projects.webappsec.org/w/page/13246946/Integer%20Overflows

+4

+1更多的信息在這裏http://www.owasp.org/index.php/Integer_overflow – Shaji 2010-05-26 14:16:10

+1

作爲例子下面由Ira Baxter解釋,它必須是一個特定的情況那樣 - 在你上下流動一個整數當分配一個散列/緩衝區/數組,允許你訪問你不應該訪問的內存,然後有一個方法來計算FP等。 – wuntee 2010-05-26 15:28:14

+0

@wuntee:我不認爲有任何意見試圖縮小它像這樣。每種情況都不一樣。足智多謀的人們找到了一種無法想象的方式!我記得在netscape中有一個單一的錯誤,用一個空格覆蓋單個字節。人們能夠利用它! – 2010-05-26 16:17:51

3

這取決於變量是如何使用的。如果你從來沒有根據整數加上輸入整數(如果對手可能會引發溢出)做出任何安全決定,那麼我想不出你將如何陷入困境(但這種東西可能很微妙)。

再說,我已經看到了很多這樣的代碼不驗證用戶輸入(雖然這例子是人爲的):

int pricePerWidgetInCents = 3199; 
int numberOfWidgetsToBuy = int.Parse(/* some user input string */); 
int totalCostOfWidgetsSoldInCents = pricePerWidgetInCents * numberOfWidgetsToBuy; // KA-BOOM! 

// potentially much later 
int orderSubtotal = whatever + totalCostOfWidgetInCents; 

一切都是沒說的,直到有一天你賣671299只小部件 - $ 21,474,817.95。老闆可能不高興。

+1

是的,但是你如何利用它來獲得優勢?你怎麼會導致重寫幀指針 - 例如... – wuntee 2010-05-26 15:19:09

+0

一個更好的例子是: int arraySize = [some user input]; int array [arraySize]; – wuntee 2010-05-26 15:30:10

+3

您不能使用此示例來覆蓋幀指針。但是,您可以使用它來竊取4200萬美元,這仍然在利用安全問題。 – 2010-05-26 15:55:19

11

我在60年代末在IBM 360/40上使用了APL/370。 APL是一種語言,其中基本上所有東西都是一個多維數組,並且有操縱數組的驚人操作符,包括從N維到M維等等。

不出所料,N維的索引界限爲1。 .k不同的正數 k爲每個軸..和k在法律上總是小於2^31(32位有符號機器字中的正值)。現在,N維的陣列在內存中分配一個位置。嘗試訪問數組插槽使用太大的軸索引檢查APL上限數組。當然這適用於N == 1的N維數組。

APL沒有檢查你是否用RHO(數組整形)操作符做了一件令人難以置信的蠢事。 APL只允許最多64個維度。所以,你可以創建一個1-64維數組,如果數組維數都小於2^31,APL會這樣做。或者,您可以嘗試製作一組​​尺寸。在這種情況下,APL蠢蠢欲動,出人意料地退回了一個64維陣列,,但未能檢查軸的尺寸。 (這在發生「整數溢出」的情況下有效)。這意味着您可以創建一個軸大小爲2^31或更大的數組...但被解釋爲帶符號整數,它們被視爲負數。

適用於這樣一個數組的右側RHO操作符咒語可以將維度減少到1,並且上限爲,得到這個「-1」。把這個矩陣稱爲「蟲洞」(你會明白爲什麼)。這種蟲洞陣列在內存中的位置與其他陣列一樣。但是所有數組訪問都是根據上限進行檢查的......但是數組綁定檢查竟然是由無符號的比較APL。因此,您可以無異議地訪問WORMHOLE [1],WORMHOLE [2],... WORMHOLE [2^32-2]。實際上,您可以訪問整個機器的內存。

APL還有一個數組賦值操作,可以在其中使用值填充數組。 WORMHOLE [] < -0因此歸零所有的內存。

我只做過一次,因爲它擦除了包含我的APL工作區,APL解釋器的內存,並且明顯是啓用分時的APL的關鍵部分(在那些日子裏它不受用戶保護)......終端室 從機械上非常嘈雜的正常狀態(我們有2741臺Selectric APL終端)在大約2秒鐘內變爲無聲狀態。 通過玻璃進入電腦室,我可以看到操作員在370全部熄燈時看起來驚呆了。大量的奔跑隨之而來。

雖然當時很有趣,但我仍然閉着嘴。

在一些照顧下,顯然可能會以任意方式篡改操作系統。

+0

我完全可以看到如何利用此功能(因爲您可以訪問機器的所有內存)。我猜想的想法是,這一切都取決於具體情況 - 在這種情況下,應用程序不會檢查數組的分配,其中數組的大小是一個整數。我的思想被困在簡單的'緩衝區溢出'中,並且認爲有一種方法可以使'int x = y + z * w'其中y和z和w都是用戶定義的,並且在那個語句中可以以某種方式寫入內存以可靠的方式。 – wuntee 2010-05-26 15:25:58

+1

那麼,我的例子中的應用程序*正在對數組分配進行邊界檢查,但實際上這種檢查是通過在數組中綁定自身來實現的。你可以讓你的例子像這樣工作:x = y + z; data [x]其中x的計算溢出。在C中,沒有投訴;你定義@(&data + x)。如果你可以將x設置爲任何東西(通過溢出),你可以訪問任何東西。 – 2010-05-26 17:22:05

3

一個常見的情況是通過詢問將提供的輸入數量,然後試圖強制執行該限制來防止緩衝區溢出的代碼。考慮一下我聲稱提供2^30 + 10整數的情況。接收系統分配一個4 *(2^30 + 10)= 40字節(!)的緩衝區。由於內存分配成功,我可以繼續。當我發送第11次輸入時,輸入緩衝區檢查不會阻止我,因爲11 < 2^30 + 10。但是,我會溢出實際分配的緩衝區。

2

我只想總結一下我發現的關於我原來的問題的一切。

事情讓我感到困惑的原因是因爲我知道緩衝區溢出是如何工作的,並且可以理解如何輕鬆利用它。整數溢出是一種不同的情況 - 你不能利用整數溢出來添加任意代碼,並強制改變應用程序的流程。

但是,可能會溢出一個整數,例如用於索引數組以訪問內存的任意部分。從這裏,可能會使用錯誤索引的數組來覆蓋內存,並導致應用程序的執行更改爲惡意目的。

希望這會有所幫助。