私は新人ですが、最近はバッファオーバーフローの仕組みを理解するためにバッファオーバーフローに取り組んでいます。保存されたEBPはまだEBPレジスタにリンクされていますか?
私はあなたがアセンブリにこれらを見たときに関数が呼び出されることを知っている:
push ebp ; Save the caller's ebp
mov ebp, esp ; Update ebp with current stack frame's esp
最初は、私は、呼び出し側のEBPはスタック上に保存された後、あなたがそれを開くとき、それだけで変更されるだろうと推測しました。 バッファオーバーフローに関する試行錯誤をした後、保存されたEIPをカバーするペイロード(77777777¥x0e¥x86¥x04¥x08など)を作成した場合、EBPレジスタもペイロードによって変更されることに気付きました。
ペイロードが、保存されたeipと保存された発信者のebpの値をスタックに変更することはわかっていますが、どのようにebpレジスタも変更できますか? スタックポイント内のエントリのアドレスがまだレジスタ自身にリンクされていますか?
'ret'の直前の関数の終わりを見てください。あなたは何を見ますか? ebpが最初にプッシュされた場合、最終的に何が起こる可能性がありますか? –
ああ、私は休暇もebpをポップすることを忘れていたので、scanfの保存されたebpは私の入力によって覆われ、オーバーフローがそれに変更を加えました。私をきれいにしてくれてありがとう。 – Daunick