什麼是一個整數溢出?
這種常見問題的答案是書面的k4thryn :
一個整數溢出,或整數包裝,是一個潛在的問題,在一個程序的事實為基礎的價值,可在一個有限的數字數據類型的數據類型的大小以字節為單位。 的ANSI C使用下列最低大小:
| 數據類型 | 大小(字節) |
|---|---|
| 焦炭 | 1 |
| 短的 | 2 |
| 國際 | 2 |
| 長的 | 4 |
在實踐中,許多編譯器使用一個4字節的詮釋。 還應當指出的是,實際範圍的數據類型取決於它們是否簽署。 例如,簽署2字節短期可能-32767和32767之間,而一個無符號短可能是介於0和65535 。 看到您的[包括] / limits.h文件進行了具體的數字為您的編譯器。
為什麼要你照顧? 如果您嘗試將值的數據類型是太小,無法舉行,該高階位的下降,只有低階位存儲。 換句話說,就是模算術上執行之前存放的價值,以確保它符合的數據類型。 考慮我們的無符號短例如:
| 限制: | 65535或1111 1111 1111 1111 |
| 太大: | 65536或1 0000 0000 0000 0000 |
| 什麼是存儲: | 0或0000 0000 0000 0000 |
由於上述使得顯然,這種結果是因為高階(或最左邊的)位的價值是太大的下降。 或者你可以說,什麼是存儲的結果
存儲=值% (上限+ 1 ) 或 65536 % ( 65535 + 1 ) = 0
在簽署的數據類型,其結果是有些不同,導致一些看似奇怪的行為:
| 積極的限制: | 32767或0111 1111 1111 1111 |
| 太大: | 32768或1000 0000 0000 0000 |
| 什麼是存儲: | -32768 |
為什麼? 這是因為“ 2的恭維, ”這是如何負數代表二進制。 作出長話短說,上半年的範圍( 0到0111 1111 1111 1111 )是用於積極的號碼順序至少最大。 下半年的範圍內,然後用於負數的順序至少最大 。 所以會出現負增長的簽署2字節短是-32768通過-1 ,在這一秩序。
您還在問為什麼這個問題,是不是? 假設內存分配的基礎上簽署的整數數據類型的值。 如果該值已纏,可能是太少內存將提供。 或者正在取得比較之間簽署的整數值和其他一些數字,假設前應小於後者,如果該值已經飛越到否定的,比較會通過。 但是,事情的行為方式的程序員呢? 也許不能。
額外的信息來源整數溢出
雖然它已超出本文的範圍,還有其他資源,進入更詳細整數溢出漏洞,預防,和他們的剝削。 即,有兩個非常有趣的文章Phrack # 60 ( 1的烏迪德Horovitz ,和一個由blexim )整數溢出漏洞。 整數包裝問題也包括在“專業的源代碼審計”介紹從2002年美國黑帽簡報 (多德等作為) 。
一種工具,實驗與整數溢出
該計劃int_wrap.c允許你玩這種行為是具體的命令行是否數據類型(短)應簽署或簽署,並價值要使用。
注意:的Perl似乎有一個250位數的限制號碼,以及模具的錯誤“號碼太長” (版本5.8.0測試) 。 然而,一些重要的數字遠低於這一點。
|
漏洞管理傻瓜
我們的朋友在Qualys的是提供免費的副本,電子版的漏洞管理傻瓜以技術問題解答讀者。 漏洞管理傻瓜:
| |






