この整数オーバーフローは悪用可能ですか?答えが「はい」の場合、どうすれば悪用できますか?
char buffer[20];
int len = atoi(argv[1]);
if(len < 20)
memcpy(buffer,argv[2],len);
Lenを-1に設定すると、コピーするバイト数が長すぎてsegfaultが発生するため、アプリケーションがクラッシュします。しかし、この脆弱性を利用する方法または方法はありますか?
はい
-1を使用する必要はありません。20より大きい値を指定すると、バッファがオーバーフローする可能性があります。
これは、次の命令とコンパイラーによって設定された緩和策に依存しますが、この時点から、おそらく戻りアドレスを上書きし、2番目のパラメーターとして提供されたシェルコードを実行できます。
危ない。
それは悪用可能ですか?たぶん。クラッシュを引き起こす可能性があることはすでに説明したので、argv 1 のソースによっては、システムをクラッシュさせることでシステムをDoSできる可能性があります。ハードコードされた値である場合、または呼び出し元のアプリによって生成され、0から20までしかできない場合は、システムで悪用できない可能性があります。小さな変更によって悪用される可能性があるため、それは依然として悪いコーディングパターンです。または、決して実行されないコード、または自分だけが実行し、他の誰もそれを実行しないコードである場合、ファイアウォールルールは0未満または20を超える値を防止するなど、悪用されることはありません。
実行可能ですか?多分。どちらの方法かを判断するのに十分な情報がありません。コンパイラがスタックカナリアを挿入するかどうかはわかりません。 argv 1 を制御し、それを安全な値に強制する他のコードがあるかどうかはわかりません。
ヒントが必要な場合、Windowsで実行している場合は !exploitable を使用してみてください(他のOS用のツールは覚えていません)。
Argv [1]が数値ではない可能性について誰も考えていないようです。最初の引数として「this」と入力すると、atoiは0を返します。また、0 <20であるため、バッファをオーバーフローさせることもできます。atoiは、多くの点で適切な選択肢ではありません。入力ミスを検出できるstrtolを使用することをお勧めします。