2017-11-08 10 views
0

私は新人ですが、最近はバッファオーバーフローの仕組みを理解するためにバッファオーバーフローに取り組んでいます。保存された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レジスタも変更できますか? スタックポイント内のエントリのアドレスがまだレジスタ自身にリンクされていますか?

+0

'ret'の直前の関数の終わりを見てください。あなたは何を見ますか? ebpが最初にプッシュされた場合、最終的に何が起こる可能性がありますか? –

+0

ああ、私は休暇もebpをポップすることを忘れていたので、scanfの保存されたebpは私の入力によって覆われ、オーバーフローがそれに変更を加えました。私をきれいにしてくれてありがとう。 – Daunick

答えて

0

ebpが指し示す格納値がバッファオーバーフローで上書きされた場合、レジスタは変更されません。 (a)の値をのアドレスで見て、ebpに保存されていますか? (b)retコールの後にebpの価値を見ていますか?

+0

私は、入力が非常に長い場合、scanfの前後で何が起こったのかを知ろうとしていました。私はscanf自体もebpを変更することを忘れていたので、それは私を混乱させた。 – Daunick

関連する問題