Integer Overflow
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
整数オーバーフローの中心には、コンピュータプログラミングにおけるデータ型のサイズによって課せられる制限とデータの解釈があります。
例えば、8ビット符号なし整数は0から255までの値を表すことができます。8ビット符号なし整数に256の値を格納しようとすると、そのストレージ容量の制限により0にラップアラウンドします。同様に、16ビット符号なし整数は0から65,535までの値を保持でき、65,535に1を加えると値は0に戻ります。
さらに、8ビット符号付き整数は**-128から127までの値を表すことができます。これは、1ビットが符号(正または負)を表すために使用され、残りの7ビットが大きさを表すために使われるからです。最も負の数は-128**(バイナリ 10000000
)として表され、最も正の数は127(バイナリ 01111111
)として表されます。
潜在的なウェブの脆弱性にとって、サポートされている最大値を知ることは非常に興味深いです:
印刷された結果は0になります。なぜなら、charがオーバーフローしたからです:
ユーザー入力から符号付き整数が読み取られ、その後適切な検証なしに符号なし整数として扱われる状況を考えてみましょう:
この例では、ユーザーが負の数を入力すると、バイナリ値の解釈方法により、大きな符号なし整数として解釈され、予期しない動作を引き起こす可能性があります。
パスワードのサイズを格納するのに1Bしか使用されていないため、オーバーフローさせて、実際の長さが260であるにもかかわらず、長さが4であると考えさせ、長さチェック保護を回避することが可能です。
いくつかの数値が与えられた場合、z3を使用して最初の数値と掛け算して2番目の数値を得る新しい数値を見つけます:
パスワードのサイズを格納するのに1Bしか使用されていないため、オーバーフローさせて、実際の長さが260であるにもかかわらず、長さが4であると考えさせ、長さチェック保護を回避し、スタック内の次のローカル変数を上書きして両方の保護を回避することが可能です。
これはARM64では変わりません。 このブログ記事で見ることができます。
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する: HackTricks Training GCP Red Team Expert (GRTE)