私はバッファオーバーフローで悩んでいますが、Mac OSで次の単純なCプログラムを実行しているときに私が探しているものが混乱しています。 2バイトにBUFの長さを設定することにより期待通りにセグメンテーション違反が発生しない
#include <stdio.h>
int main(void) {
char buf[2];
scanf("%s", buf);
printf("%s\n", buf);
}
、私は、文字列「CCC」を入力するときにセグメンテーションフォールトを引き起こすことが予想されるが、それは起こりません。長さが24文字の文字列を入力する場合のみ、セグメント化エラーが発生します。
何が起こっているのですか?文字エンコーディングとは何か?
ありがとうございました。
です。私はペニーが落ちたと思う。悪意のある攻撃者は、スタックの残りの部分をオーバーフローさせ、結果的にレジスタを上書きすることを目指すでしょうか?しかし、彼らはスタックの残りの部分をどのように予測しますか? OSは毎回固定量のメモリを割り当てますか? –
アセンブリの出力を見ると、試行錯誤は "残りのスタック"を決定する最も良い方法です。 _same環境内の_sameバイナリの実行では同じままになる可能性はありますが、保証はありません。バッファオーバーフローはレジスタを上書きしません。スタックまたはヒープを上書きします。 – Mat
@Martin典型的な考え方は、スタック上にあるバッファをオーバーフローさせて、スタック上のデータを上書きすることです。これは、関数から戻るとCPUがどこに戻るかを示します。詳細は、「スタックを壊す」を参照してください。 –