web-dev-qa-db-ja.com

バッファーオーバーフローのためにeipを2回上書きしますか?

だから私は悪用を課されたバイナリを持っています。ただし、パスワードを(できれば)提供する関数を実行するには、root権限が必要です。

プログラムにroot権限を与える関数があり、これをバッファオーバーフローで実行し、関数のアドレスにeipを割り当てることをポイントできます。問題は、プログラムがroot権限を停止した瞬間に失われ、privileges関数が入力を受け付けないため、2番目のオーバーフローのオプションがないことです。

それで、私が行った特権関数を実行するためにバッファをオーバーフローする必要がありますが、2番目の関数を後で実行できるようにeipを「2回」上書きする方法があるかどうか疑問に思っていましたか?

ここに本質的に私が疑似コード形式で何をする必要があるかです:

./binary $(<padding>*100 + <address of privilege function> + <way to overflow a second time to run next function>

ここでのヒントやヘルプは大歓迎です。

2
Monkeybike123

単に「EIPを上書きする」だけではなく、スタックを完全に制御するというオーバーフローに留意してください。これにより、スタック上の次のリターンアドレスが必要なものであることを確認できます。実行する時が来ると、EIPになります。これは理解することが重要です。

オーバーフローを使用して制御フローを別の関数にリダイレクトする場合、新しく呼び出された関数は、完了時に戻りアドレスをどこで探しますか?再び、スタック!

この知識に加えて、プログラムのアーキテクチャの適切な呼び出し規約を使用して、スタックを形成し、複数の関数をチェーン化できます。これは、ROP(リターン指向プログラミング)の基本的な例です。

X86 Linuxバイナリの場合、これは、スタックが(オーバーフローする順序で)下位アドレスから上位アドレスへの呼び出し関数に関してどのように見える必要があるかです。

<function_to_call_addr> <next_return_addr> <arguments_for_function>... <function_to_call_addr> <next_return_addr> <arguments_for_function>... ...

これで、常に関数を呼び出す必要はありません。 「ROPガジェット」に戻ることもできます。通常、1つ以上の有用な指示の後にretが続きます。ただし、引数を渡さない場合は、スタックのクリーンアップなどについて心配する必要はありません。したがって、ペイロードは次のようになります。

overflow + privileges + password + AAAA

これはprivilege関数を呼び出し、次の戻りアドレスがpasswordのアドレスであることを通知します。次のアドレスは重要ではありません。うまくいけば、あなたが望んでいたものを手に入れたことになります。完了するには、プログラムの通常の実行を再開するように変更できます。

これが間違っている場合はお知らせください。最近は主にx64 Linuxで作業しているので、私のx86は少し錆びています。

1
multithr3at3d