
x64 Linux向けの、ptraceを使わないシンプルな共有ライブラリインジェクタ
x64 Linux向けの、ptraceを使わないシンプルな共有ライブラリインジェクタです。
linux_injector <mode> <pid> <file>
mode
pid
対象プロセスID。それに対するptrace権限が必要です(/proc/$pid/mem にアクセスするために必要)。ptraceは行われないため、他のプロセスが自由にptraceできます。
file
モード1: 注入するモジュール。リモートプロセス内で dlopen されます。解決にはリモートの LD_LIBRARY_PATH が使われるため、フルパスにすべきです。
モード2: 注入するモジュール。コンテンツがコピーされたmemfdからリモートプロセス内で dlopen されます。
モード3: 注入する生のシェルコード。16バイト整列されたアドレスにマッピングされ、ランダムにハイジャックされたスレッド上で実行を開始します。フックを仕込むかスレッドを作成してから復帰してください。
制御フローの乗っ取りには、このプログラムはハイジャック対象の候補を必要とします。ここに示すコードは malloc を使用していますが、FUN_NAME を編集して再コンパイルすることで変更できます。フックした関数は100ms未満で実行できることを確認してください。実行中に上書きされないようにするためです。つまり sleep や wait のような呼び出しは、初期シェルコードの対象としては不適切です。また、対象の関数は、シェルコードが他の関数を上書きしないように、0x50 より長い必要があります。
Glibc と musl は、対象プロセスとソースプロセスの両方でサポートされています。対象プロセスはコンテナ内で実行されていてもよく、異なるlibcを使用することもできます。モード2と3は、対象プロセスがアクセスできるパスを必要としません。
モード2には Linux 3.17 が必要です。
Oracle Linux 7(モード2は非対応)、Fedora 37、Alpine Linux 3.17 でテスト済み。