自分のケース、さらに重要なことに、同様のケースで何が起こるかを検討することは非常に理にかなっています。他のポスターが指摘したように、UB を呼び出します。それはおそらく本当です。しかし、誰かが次に何が起こるべきかを正確に定義しなかったという理由だけで、世界が止まるわけではありません。次に物理的に起こることは、おそらく重大なセキュリティ ホールです。
文字列XXX...
が制御されていないソースからのものである場合、バッファ オーバーフローの脆弱性が発生する寸前です。
(1) 通常、スタックは逆方向に「成長」します。つまり、アドレスが小さいほど、スタックがいっぱいになります。
(2) 文字列は、文字 n+1 が文字 n の後に格納されるように、その文字列に属する文字が格納されることを期待します。
(3) 関数を呼び出すと、戻りアドレス、つまり関数が戻った後に実行される命令のアドレスがスタックにプッシュされます (とりわけ、通常)。
次に、関数のスタック フレームを考えてみましょう。
|----------------|
| buf [size 8] |
|----------------|
| (func args) |
|----------------|
| (other stuff) |
|----------------|
| return address |
|----------------|
悪意のあるユーザーは、スタック上のリターン アドレスとの間のオフセットが正確に何であるかを調べることによって、制御されていない関数がスタック上のアドレスを上書きする時点で、攻撃者が選択したアドレスが文字列に含まれるbuf
ように、アプリケーションへの入力を操作する可能性があります。スタック上の戻りアドレス。(注:利用可能な場合は、より適切に使用してください)。これにより、攻撃者はバッファ オーバーフロー攻撃を仕掛けました。彼はNOP スレッド テクニックのようなものを使用して、アプリケーションにシェルを開始させるかもしれません。特権ユーザー アカウントで実行されるアプリケーションを作成していた場合、攻撃者に貸衣装のシステムへの第 1 級のエントリであるACEを提供したことになります。XXX...
sprintf
snprintf
あなたが望むなら、穴。
アップデート
発生する実行時エラーは、上書きされたリターン アドレスが原因である可能性があります。基本的にガーガベで埋めたので、CPUがジャンプしたアドレスには、プログラムテキストとして解釈され、無効なメモリアクセスを引き起こすバイトシーケンスが含まれている可能性があります(またはアドレス自体がすでに不良でした)。
一部のコンパイラは、これらの種類のエラーに対して役立つことに注意してください。たとえば、GCCには-fstack-protector
. それらの機能がどれほど優れているかはよくわかりません。