どのような整数オーバーフローは何ですか?
このFAQに答えるk4thrynによって書かれました:
整数オーバーフロー、または整数の包装は、プログラムでは、実際には数値データ型で開催される値はバイト単位でのデータ型のサイズが制限されているに基づいて潜在的な問題にされています。 のANSI Cは、以下の最小サイズを使用しています:
| データ型 | サイズ(バイト) |
|---|---|
| 文字 | 1 |
| 短い | 2 |
| INTは | 2 |
| 長い | 4 |
実際には、多くのコンパイラは、 4バイトのINTを使用しています。 また、データ型の実際の範囲は、署名されているかどうかに依存することに注意する必要があります。 中に短い符号なし0 〜 65535の間にされることがあります例えば、署名2 -短期バイト-32767から32767の間にあり、可能性があります。 参照してください[お客様のコンパイラに固有の番号について] / limits.hファイルが含まれています。
どうしてそんなこと気にいいですか? 場合は、それを保持するためにも小さいデータ型に値を入れるしようとすると、高次ビット、およびドロップされると、下位のビットのみが格納されている。 モジュロ演算は、その値に収まるようにデータを保管する前に実行されているとのもう一つの方法です。 我々の未署名の短い例撮影:
| 制限: | 65535または1111 1111 1111 1111 |
| 大きすぎる: | 65536または1 0000 0000 0000 0000 |
| どのように保存されて: | 0または0000 0000 0000 0000 |
これは、高(または左の値が大き過ぎるのほとんど)ビットを落としているため、上記のように明らかにし、その結果だ。 か、何に保存されていることの結果である
=値%保存(制限+ 1 ) または 六五五三六% ( 65535 + 1 ) = 0
署名データ型では、いくつかの一見奇妙な振る舞いをする結果とは少し異なる結果です:
| 正の制限: | 32767または0111 1111 1111 1111 |
| 大きすぎる: | 32768または1000 0000 0000 0000 |
| どのように保存されて: | -32768 |
なぜだ? これは2のため"と褒め、 "負の数がどのように表現されるバイナリです。 かいつまんで、範囲( 0 〜 0111 1111 1111 1111 )の最初の半分以上の順に正の数については最大するために使用されています。 の範囲の2番目の半分以上を順番に、負の数の最大のために使われます 。 ので、署名2の負の範囲は-32768 -1を通じてショートバイトの順にされています。
でも、なぜこの問題は、要求されていないんですよね? メモリは、符号なし整数データ型の値に基づいて配分されていると仮定します。 その値をラップしている場合は、ほんのわずかなメモリを利用できるようにされる可能性があります。 または比較する場合は、符号付き整数値との間にいくつかの他のコードには、前者は後者よりも、その値が負の場合は、比較を渡すとしている以下にすべきであると仮定したoverflownされています。 しかし、あるものは、プログラマーの意図したように動作するのかな? おそらくされていません。
整数オーバーフローに関する情報の追加ソース
また、この資料の範囲外ですが、そこに整数オーバーフローのバグの詳細については詳細になる他のリソースは、その予防、およびその開発。 すなわち、オーデッドHorovitzによってPhrack # 60 ( 1つに2つの非常に興味深い記事を、一blexim )の整数オーバーフローの脆弱性があります。 整数の包装は、 "プロのソースコード監査では、 2002年米国ブラックハットブリーフィング(ダウド、エはALS ) "と題したプレゼンテーションを覆われている。
実験に整数オーバーフローのツールで
このプログラムはint_wrap.c場合は、コマンドラインかどうかは、データのタイプ(ショート)に指定することにより、この現象で署名する必要がありますまたは符号なしの値を使用すると、周りを再生することができます。
注: Perlのは、 250桁の数を制限していると、エラー"番号が長すぎると死ぬ" (バージョン5.8.0テスト) 。 しかし、有効桁数よりもずっと少なくなっています。
|
脆弱性管理ダミーの
最新のブログの投稿
- 乾燥方法は 、 携帯電話を連絡先に水で 、 是非のに






