Integer Overflow
基本情報
整数オーバーフローの中心にあるのは、コンピュータプログラミングのデータ型のサイズとデータの解釈によって課せられる制限です。
例えば、8ビット符号なし整数は、0から255までの値を表すことができます。8ビット符号なし整数に256の値を格納しようとすると、その格納容量の制限により、0にラップアラウンドします。同様に、16ビット符号なし整数は、0から65,535までの値を保持できますが、65,535に1を加えると値が0に戻ります。
さらに、8ビット符号付き整数は、-128から127までの値を表すことができます。これは、1ビットが符号(正または負)を表すために使用され、残りの7ビットが大きさを表すためです。最も負の数は**-128**(バイナリ 10000000
)で表され、最も正の数は127(バイナリ 01111111
)です。
最大値
潜在的なWeb脆弱性に関して、サポートされる最大値を知っておくことは非常に興味深いです:
整数オーバーフローは、整数演算において結果が変数のデータ型の範囲を超える場合に発生します。これは、攻撃者が意図しないコードパスを実行したり、メモリの破壊を引き起こしたりする可能性がある深刻なセキュリティリスクです。整数オーバーフローは、特にC言語などの低レベル言語でプログラミングされたアプリケーションでよく見られます。適切な入力検証や境界値チェックを行うことで、整数オーバーフローによる脆弱性を防ぐことが重要です。
```c #include #include
int main() { int a = INT_MAX; int b = 0; int c = 0;
b = a * 100; c = a + 1;
printf("%d\n", INT_MAX); printf("%d\n", b); printf("%d\n", c); return 0; }
符号付きから符号なしへの変換
ユーザー入力から読み取られた符号付き整数が、適切な検証なしに符号なし整数として扱われる状況を考えてみましょう。
その他の例
パスワードのサイズを格納するのに1バイトしか使用されていないため、オーバーフローさせて4の長さだと思わせることが可能で、実際には260であるため、長さチェック保護をバイパスできます。
いくつかの数値が与えられた場合、z3を使用して最初の数値に掛けると第二の数値が得られる新しい数値を見つける:
パスワードのサイズを格納するのに1バイトしか使用されていないため、オーバーフローさせて4の長さだと思わせることが可能で、実際には260であるため、長さチェック保護をバイパスし、スタック内の次のローカル変数を上書きして両方の保護をバイパスできます。
ARM64
これはARM64でも変わりません。このブログポストで確認できます。
Last updated