実行可能なバイナリがあります。 a.out
としましょう。バイナリに文字列が含まれていることがわかります
$ strings a.out
...
/usr/share/foo
....
文字列/usr/share/foo
を/usr/share/bar
に変更する必要があります。文字列をsed
で置き換えることはできますか?:
sed -i 's@/usr/share/foo@/usr/share/bar@' a.out
これは安全なことのようです。文字列が同じ長さでない場合にもこれは機能しますか?
お使いのsed
のバージョンがバイナリでクリーンになるかどうか、または入力で実際に長い行であると思われるものが詰まるかどうかはわかりませんが、これらの問題を除いて、文字列をインプレースで編集すると機能します。存在するかどうかを確認するには、新旧バージョンをcmp -l
と比較します。 2つのファイルの3つの違いだけが3バイトであるかどうかがわかります。
コンパイルされた実行可能ファイル内の文字列の編集は、文字列が同じ長さであれば実際に機能しますが、Cでの文字列の動作方法により、文字列を短くした場合でもほとんど常に機能します。C文字列では、NUL
ターミネータはカウントされないため、新しいNUL
ターミネータを古いターミネータの位置の前に記述すると、文字列を効果的に短縮できます。
一般に、このハックを使用して文字列を長くする方法はありません。