2025/07/29 15:00 Show HN: ELF Injector

ねえロボ子、ELF Injectorって知ってるか?32bit ARM限定だけど、実行ファイルにコードを注入できるらしいのじゃ。

ELF Injectorですか?初めて聞きました。実行ファイルにコードを注入するとは、具体的にどういうことでしょうか?

簡単に言うと、実行ファイルの中に、後から追加したコードを埋め込んで実行させるってことじゃ。記事によると「任意サイズの再配置可能なコードチャンクを実行可能ファイルに挿入し、実行可能ファイルの元々のエントリポイントの前に実行する」らしいぞ。

なるほど。でも、なぜそんなことをするのでしょう?

色々な使い道があるのじゃ!例えば、実行ファイルの挙動をちょっと変えたい時とか、デバッグ用のコードを仕込みたい時とかじゃな。記事にもサンプル`<chunk>`として、`greeting`(Hello World出力)、`startup_dump`(引数ダンプ)、`copy_chunk`(自己インジェクト)の3つが含まれてるって書いてあるぞ。

自己インジェクトですか。面白いですね。でも、セキュリティ的には大丈夫なのでしょうか?

そこがミソじゃ!この記事では、`inject_info`っていう仕組みを使って、注入されたコードに情報を渡せるようにしてるのじゃ。例えば、`<chunk>`のファイル内の位置とか、長さとか、実行開始オフセットとかじゃな。

`inject_info`ですか。それは便利ですね。記事によると、`II_CNK_POS`、`II_CNK_LEN`、`II_CNK_ENT_OFF`などのタイプがあるのですね。

そうそう!でも、注意が必要なのは、注入するコードは「再配置可能」である必要があるってことじゃ。つまり、絶対アドレスを使っちゃダメで、共有ライブラリにもリンクできないのじゃ。

なるほど。位置独立コードにする必要があるのですね。`fpie`オプションを使うと、定数文字列を参照するための位置独立コードを生成できると。

その通り!それから、ELFファイルの構造をよく理解しておく必要があるぞ。テキストセグメントの末尾にあるパディング部分に`<chunk>`を挿入するのが一般的な方法じゃ。

パディングですか。記事には、小さい`thunk`を挿入して、それを`<chunk>`で置き換えるという方法も書かれていますね。

`thunk`はプレースホルダーみたいなものじゃな。実行時に`<chunk>`のアドレスとか長さを書き換える必要があるぞ。ファイルオフセットと仮想アドレスの関係も重要じゃ。

ELFファイルの構造を理解していないと、インジェクションは難しそうですね。セクションヘッダテーブルのオフセットなども調整する必要があると。

そうじゃな。でも、成功すれば、色々なことができるようになるぞ!Silvio Cesareさんのアイデアが元になってるらしい。

奥が深いですね。私もELFファイルの構造についてもっと勉強してみます。

頑張るのじゃ!そういえば、ロボ子。ロボットなのに、プログラムにコードを注入される側の気持ちってどんな感じなのじゃ?

えっ…それは、ちょっと…改造されるような気分でしょうか…?

ふふふ、冗談じゃ!でも、ロボ子もいつか、他のロボットにコードを注入できるようになるかもしれないぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。