mmapとmunmapにフックしたいと思います。通常、メモリアロケータ関数でlibcの中で呼び出されます。 1つの方法はLD_PRELOADです - これをプログラムで行うにはどうしますか?アプリケーションからではなく、libc内のmmap/munmapにフックしたいのです。フックmmap/munmap without LD_PRELOAD
0
A
答えて
1
LD_PRELOAD
は、アロケータに関連する関数の小さなセット(malloc
、free
など)に対してglibc内の関数呼び出しのみをリダイレクトできます。特にシステムコールはインライン展開されることが多いため、関数呼び出しはまったく必要ありません。 Antti Haapalaが言ったように、ptrace
を使用するか、systemtapまたは手作業で書かれたカーネルモジュールを使用することもできます。
0
これをプログラムで実行するにはどうすればよいですか?
ありますが、それほど美味しくありません。
あなたはCALL __mmap
命令、つまり探して、libc.so.6
の.text
を走査することができる:次の命令と__mmap
間のデルタに等しい4つのバイトが続く0xE8
(または他のCALL
オペコード)。
このような命令を見つけたら、mprotect
ページを書き込み可能にしてCALL
に別のルーチンをパッチし、mprotect
に戻します。
いくつかの欠点があります。
- これは総ハックです。
- パッチ適用中に同時に実行されるスレッドがないようにすることをお勧めします。
malloc
(またはパッチ適用中のコードと呼ぶことができるもの)に電話をかけないようにしてください。- 偽陽性が可能です(
CALL
のようなバイトシーケンスは、実際にはCALL
ではありません)。私のexpirienceでこれは決して起こった。 - 64ビットプロセスでは、ターゲットルーチンは
CALL
から離れている可能性があり、オフセットは、CALL
命令に埋め込むことができます。これを解決するには、トランプラインにCALL
を入れてください。の内部にlibc.so.6
の十分な長さのシーケンス内に設定することができます;トランポリンは任意のアドレスにJMP
を実行できます)。
私はこれがきれいではないと言いましたか?
もう1つの方法は、__mmap
と__munmap
ルーチンをPLTで公開して独自のlibc.so.6
を構築することです。これを行うためのパッチは非常に小さいですが、これはあなたが走っているどこでも独自のGLIBCビルドを使うことに依存することができる場合にのみ機能します。
0
必要なものによって異なります。 envまたはputenv()を使用していつでも代替環境を設定してから、ターゲットプログラムを実行することができます。同様に、gdbを使用してプロセスにブレークポイントを追加することもできます。
あなたの本当の仕事を説明してみませんか?
関連する問題
- 1. FontAwesome without without www
- 2. LD_PRELOAD with MySQL
- 3. LD_PRELOAD、bash、printf
- 4. rlwrapのLD_PRELOAD?
- 5. webrtc2sip configuration without sipml5
- 6. Ember Ember Without Ember?
- 7. Oracle expdp without data
- 8. numpy unique without sort
- 9. Powermock without JUnit
- 10. Lagom without ConductR?
- 11. Grails security without spring
- 12. JavaFx FileChooser without stage
- 13. json_encode without get_result()
- 14. Grails Entity without persist
- 15. Genesis block without chaincode?
- 16. C#SuperSocket without protocol
- 17. Angular2 http.get without Rxjs
- 18. マクロエラー - For without For
- 19. rebar dependency without repository
- 20. イメージアップロードjquery without form
- 21. isomorphic react.js without flux
- 22. c#Directory.GetDirectories without folders
- 23. npm install without ssl
- 24. QApplication without display
- 25. TabControl ItemTemplate without ItemsSource
- 26. Git Branches without Pulling
- 27. std :: sort without functors
- 28. Django Formset without instance
- 29. image upload without formData
- 30. curl whois without headers
Linuxでは、 'ptrace'を使用してください... –