有沒有人有如何整數可以被利用的詳細解釋?我一直在閱讀很多關於這個概念的知識,並且我理解它是什麼,並且我理解緩衝區溢出問題,但我不明白如何可靠地修改內存,或者修改應用程序流程的方式,通過使整數大於其定義的內存....整數溢出如何被利用?
回答
這絕對是可利用的,但取決於當然的情況。
舊版本的ssh有一個整數溢出,可以被遠程利用。漏洞利用導致ssh守護進程創建一個大小爲零的哈希表,並在嘗試在其中存儲一些值時覆蓋內存。
上的SSH整數溢出更多細節:整數溢出http://www.kb.cert.org/vuls/id/945216
更多細節:http://projects.webappsec.org/w/page/13246946/Integer%20Overflows
+1更多的信息在這裏http://www.owasp.org/index.php/Integer_overflow – Shaji 2010-05-26 14:16:10
作爲例子下面由Ira Baxter解釋,它必須是一個特定的情況那樣 - 在你上下流動一個整數當分配一個散列/緩衝區/數組,允許你訪問你不應該訪問的內存,然後有一個方法來計算FP等。 – wuntee 2010-05-26 15:28:14
@wuntee:我不認爲有任何意見試圖縮小它像這樣。每種情況都不一樣。足智多謀的人們找到了一種無法想象的方式!我記得在netscape中有一個單一的錯誤,用一個空格覆蓋單個字節。人們能夠利用它! – 2010-05-26 16:17:51
這取決於變量是如何使用的。如果你從來沒有根據整數加上輸入整數(如果對手可能會引發溢出)做出任何安全決定,那麼我想不出你將如何陷入困境(但這種東西可能很微妙)。
再說,我已經看到了很多這樣的代碼不驗證用戶輸入(雖然這例子是人爲的):
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。老闆可能不高興。
我在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全部熄燈時看起來驚呆了。大量的奔跑隨之而來。
雖然當時很有趣,但我仍然閉着嘴。
在一些照顧下,顯然可能會以任意方式篡改操作系統。
我完全可以看到如何利用此功能(因爲您可以訪問機器的所有內存)。我猜想的想法是,這一切都取決於具體情況 - 在這種情況下,應用程序不會檢查數組的分配,其中數組的大小是一個整數。我的思想被困在簡單的'緩衝區溢出'中,並且認爲有一種方法可以使'int x = y + z * w'其中y和z和w都是用戶定義的,並且在那個語句中可以以某種方式寫入內存以可靠的方式。 – wuntee 2010-05-26 15:25:58
那麼,我的例子中的應用程序*正在對數組分配進行邊界檢查,但實際上這種檢查是通過在數組中綁定自身來實現的。你可以讓你的例子像這樣工作:x = y + z; data [x]其中x的計算溢出。在C中,沒有投訴;你定義@(&data + x)。如果你可以將x設置爲任何東西(通過溢出),你可以訪問任何東西。 – 2010-05-26 17:22:05
一個常見的情況是通過詢問將提供的輸入數量,然後試圖強制執行該限制來防止緩衝區溢出的代碼。考慮一下我聲稱提供2^30 + 10整數的情況。接收系統分配一個4 *(2^30 + 10)= 40字節(!)的緩衝區。由於內存分配成功,我可以繼續。當我發送第11次輸入時,輸入緩衝區檢查不會阻止我,因爲11 < 2^30 + 10。但是,我會溢出實際分配的緩衝區。
我只想總結一下我發現的關於我原來的問題的一切。
事情讓我感到困惑的原因是因爲我知道緩衝區溢出是如何工作的,並且可以理解如何輕鬆利用它。整數溢出是一種不同的情況 - 你不能利用整數溢出來添加任意代碼,並強制改變應用程序的流程。
但是,可能會溢出一個整數,例如用於索引數組以訪問內存的任意部分。從這裏,可能會使用錯誤索引的數組來覆蓋內存,並導致應用程序的執行更改爲惡意目的。
希望這會有所幫助。
- 1. 如何利用緩衝區溢出?
- 2. 整數溢出
- 3. Swift:如何禁用函數的整數溢出/下溢陷阱
- 4. 整數溢出/下溢
- 5. 利用緩衝區溢出
- 6. 整數不溢出
- 7. 長整數溢出
- 8. 整數溢出C
- 9. rlimit64整數溢出
- 10. 如何關閉整數溢出保護?
- 11. 你如何計算整數溢出?
- 12. Javascript處理整數溢出和下溢嗎?如果是,如何?
- 13. 整數溢出PHP模數
- 14. java如何處理整數溢出和下溢?
- 15. basic_streambuf函數如何溢出和溢出
- 16. 股利溢出到左
- 17. awk中的整數溢出
- 18. 檢測整數溢出
- 19. c整數溢出 - 環繞
- 20. Java中整數的溢出
- 21. (!!)運算符溢出整數
- 22. Perl包()和整數溢出
- 23. 處理ctype.h整數溢出
- 24. 整數溢出平臺
- 25. 的JavaScript整數溢出
- 26. 大整數堆棧溢出
- 27. 整數溢出查詢
- 28. 整數溢出操作
- 29. 整數溢出問題
- 30. 阿達:整數溢出
一個[不涉及數組/內存操作的可能漏洞](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