コンピュータソフトウェアセキュリティの割り当てに対して、libcに戻るバッファオーバーフロー攻撃を試みました。私の理解では、canaries
やnon-executable stack
などのスタック保護対策に関係なく、この種の攻撃を行うことができます。これは、libc
関数がスタックに存在せず、戻りアドレスをlibc function address
で上書きして適切な引数を渡すことにより、プログラムの制御フローをシフトする必要があるためです。この図は、私が推測する手順を要約しているようです。
私の疑問は、2番目の部分の図によると、スタックフレームがlibc
関数に指定されているのですか、それともユーザーのプログラム自体で定義されている関数だけなのですか? fake_ret
の必要性を理解できません。 EIP
をsay unlink
のアドレスで上書きして、関数の戻りアドレスを上書きすることはできません。引数は、ユーザーの関数バッファーに配置して、 unlink
関数?
ユーザーの(何か)を使用することにより、ユーザー自身がプログラムで定義した(何か)を指すことを目的としています。ありがとう。
任意の関数呼び出しのフレームを記述できます。フレームはsystem()
である必要はありません。ただし、ほとんどのエクスプロイトは、可能であればシェルを狙います。 _fake_ret
_アドレスは、system()
呼び出しの後に実行が戻る場所です。そこに_\x41\x41\x41\x41
_を置くと、segfaultになります。 exit()
にポイントすると、正常に終了します。または、_pop register
_の後にポイントして、スタック(ROP)の実行を制御するretを続けてもかまいません。