なぜ禁忌関数なのか?
C言語の strcpy は、「コピー先バッファの残りサイズ」を一切確認せずに、ヌル終端文字(\x00)が出現するまで隣接メモリへと文字を書き込み続けます。
CPUが関数を実行する際、関数が終わった後に元のコードの場所に戻れるよう、スタック領域に「戻りアドレス (Return Address / Saved RIP)」を一時保存しています。
バッファ領域を超えてメモリが書き換えられると、この「戻りアドレス」が上書きされ、関数が終了(ret)した瞬間に、プログラムは破壊された不正アドレス、もしくは攻撃者が仕組んだコードへジャンプしてしまいます。
• strncpy_s(dest, size, src, count): 最大コピーサイズを指定し、ヌル終端を強制。
• strlcpy(dest, src, size): 境界チェック付きコピー。
メモリ破壊ステップシミュレーター
バッファに過大入力したときのスタック構造変化を1ステップずつ追跡
初期状態。C言語のプログラムにおいて、`process_input` 関数が呼び出され、スタック上に8バイトのローカルバッファ領域が確保されました。