什麼是一個整數溢出?

這種常見問題的答案是書面的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測試) 。 然而,一些重要的數字遠低於這一點。

書寫安全的代碼 建設安全的軟件 安全編碼 安全編程食譜
購買這些優秀的書籍安全編程在Amazon.com


最常見的5個免費網絡工具

漏洞管理傻瓜

我們的朋友在Qualys的是提供免費的副本,電子版的漏洞管理傻瓜以技術問題解答讀者。

漏洞管理傻瓜:

  • 說明了迫切需要的漏洞管理
  • 詳細介紹了基本最佳實踐步驟,一個成功的脆弱性管理程序
  • 概述了各種漏洞管理解決方案-包括優點和缺點每個
  • 聚焦屢獲殊榮的QualysGuard漏洞管理解決方案
  • 提供了一個10點的清單,消除安全漏洞從您的關鍵資源
書籤什麼是一個整數溢出?

最新的博客帖子


英文 英文 德語 德語 西班牙語 西班牙語 法文 法文 意大利語 意大利語 葡萄牙語 葡萄牙語 俄文 俄文 荷蘭文 荷蘭文
希臘語 希臘語 印地文 印地文 日語 日語 韓文 韓文 中文 中文 中文(簡體) 中文(簡體) 阿拉伯語 阿拉伯語

版權所有2009年技術常見問題解答 保留所有權利。 隱私政策。