2017-02-28 3 views
0

私はsleep()を呼び出すプロセスを実行していますが、sleep()の戻りアドレスを上書きしたいので、戻り時にコードを実行します。上書きを行うプロセスは、次に保護または分離なしで実行されます。その戻りアドレスはどこに格納されていますか、おそらくasmを使ってどのように変更しますか?カーネル関数のリターンアドレスをどのように上書きしますか?

+0

「返されたアドレスはどこに格納されますか」 - いつものようにスタックに。問題はそれを上書きする方法ではなく、どこにあるのか、そこにアクセスする方法を見つける方法です(OSはあなたのメモリにアクセスすることを許可しません)。 – Anty

+0

最適化でコンパイルし、 'sleep'関数がインライン化されているとどうなりますか? –

答えて

0

x86アーキテクチャでカーネル関数の戻りアドレスをユーザーモードから上書きすることはできません。プロセッサは、それを使用する特権制御の転送を行う際にスタックを切り替えます。
mechanism used to enter the kernel-modeに応じて、アドレスがスタック上にないことさえあります。

いつものように、Intel Software Developer's Manual 3のすべての詳細。そう、彼らはありません、まだ、カーネル関数、そのようにあなたがスタック上に「単に」毒リターンアドレスを操縦することができ - と述べ


、ユーザーモードの機能のほとんどは、システムのラッパー呼び出していますコントロールフロー(àla Return Oriented Programming)。
フッキングされた関数が返る前に、フッキングコードが実行されることを許可しました。

プロセスが孤立しているしかし、私はあなたが

上書きをしているプロセスはありません保護または隔離して次に実行されると何を意味するのか分かりません。

ただし、あなたはフックされたプロセスでペイロードを持っている必要があります。

最初にペイロードをどのように配置したかによって、ターゲット関数の呼び出しを、ペイロードの実行とともに元の関数を呼び出すプロシージャの呼び出しに変更する方が簡単かもしれませんスタックのような一時的な構造を扱う)。
コード行にペイロードを配置するように実行可能ファイルにパッチを適用する場合は、呼び出しにもパッチを適用します。

インポートされた/動的にリンクされた関数をハイジャックすることを意図している場合は、ここで指定したものよりも優れたコンテキストで特定の質問自体が必要です。