自分の ELF ファイルの実行可能コンテンツを変更して、これが可能かどうかを確認しようとしています。ELF ファイルを読み取って解析し、更新する必要があるコードを検索して変更し、セクション ヘッダーの sh_size フィールドを更新した後に書き戻すプログラムを作成しました。
ただし、これは機能しません。一部のバイトを他のバイトと交換するだけで機能します。ただし、サイズを変更すると失敗します。一部の sh_offset が互いに隣接していることは承知しています。ただし、実行可能コードのサイズを縮小している場合、これは問題になりません。
もちろん、私のプログラムには (または複数の) バグがあるかもしれませんが、私はすでに苦労してそれを調べてきました。
私のプログラムのデバッグで助けを求める代わりに、私はただ疑問に思っています.sh_sizeフィールド以外に、これを機能させるために更新する必要があるものはありますか(サイズを縮小する場合)? そのフィールド以外に長さの変更を失敗させるものはありますか?
編集:
アンディ・ロスは完全に正しかったようです。この非常に単純なプログラムでさえ、__libc_start_main でいくつかの間接アドレス指定に出くわしました。これは、到達するオフセットを更新するために単純に変更することはできません。
私は興味がありましたが、この問題を可能な限り解決しようとするための最良のアプローチは何でしょうか? すべてのケースでこれを解決できないことはわかっていますが、いくつかの単純なプログラムでは、実行に必要なものを更新できるはずですか? 独自の仮想マシンを作成してみるか、疑わしい問題の各命令を INT 3 に置き換える「デバッガー」を開発してみる必要がありますか? 何か案は?