
まず、歴史を振り返ってみましょう。私が働くところでは、少数の開発者/株主が知的財産を集めて会社を設立します。 IPとソースコードは依然として独自のものです。
さらに、数年前、私たちは第三者の産業スパイ活動に関連していくつかの問題を経験しました。このすべての理由により、一部の開発者/会社の所有者は、盗まれてもバイナリを使用できないようにする非正統的な措置を講じました。
現在の問題:私たちは、締め切りに合わせるのが難しい数値計算を実行するためにスーパーコンピュータを借りています。問題は、実行可能ファイルがネットワークディレクトリ構造に深く埋め込まれているテキストファイルへの静的依存関係を持つことです。
この「依存関係」を使用せずに再コンパイルするとどうでしょうか?問題の開発者は現在旅行中であり、このコードを再コンパイルするための締め切り前に戻るとは予想されていないためです。
実装する:
./run.sh
エラー出力:
forrtl: No such file or directory
forrtl: severe (29): file not found, unit 1, file /foo/bar/.xyz
Image PC Routine Line Source
number_crunch 000000000048B933 Unknown Unknown Unknown
number_crunch 0000000000499ADB Unknown Unknown Unknown
number_crunch 0000000000445941 Unknown Unknown Unknown
number_crunch 0000000000403BFE Unknown Unknown Unknown
libc.so.6 00002AAAAB6C10BD Unknown Unknown Unknown
number_crunch 0000000000403B09 Unknown Unknown Unknown
run.shの内容:
#!/bin/bash
#SBATCH --nodes=10
#SBATCH --job-name=number_crunch
#SBATCH --cpus-per-task=8
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/share/intel/ics2013/composer_xe_2013_sp1.2.144/compiler/lib/intel64/
module load glibc
./number_crunch
私は必要です:バイナリをだまして確認する方法/foo/bar/.xyz
構造、根力無し。
可能ですか?エイリアスではスラッシュは使用できalias
ません。ln
/
答え1
バイナリをパッチするのはどうですか?strings yourbinary | grep -F /foo/bar/.xyz
印刷する必要があります/foo/bar/.xyz
。/foo/bar/.xyz
文字列が十分に一意の場合は、次のことができます。
sed -i "s_/foo/bar/\.xyz_/control/.xyz_g" yourbinary
その中には/control/
あなたが制御できるディレクトリがあります。代替文字列の長さ(バイト)は元の文字列の長さと同じでなければなりません。代替文字列が短い場合は、NULLバイトで埋めることができます(、、、およびsed -i "_/foo/bar/.xyz_/contr/xyz\x00\x00\x00_g" yourbinary
はo
NULLl
バイト.
のために削除されます)。ただし、これが成功するかどうかは、長さにハードコードされた依存関係があるかどうかによって異なります/foo/bar/.xyz
。または、/
一部の文字()を追加してパスを増やすこともできます/tmp/////.xyz
。
代替文字列が長い場合、この内部パッチ方法を使用できない可能性があります。ただし、必要に応じて、パスは/control/xyz
適切な長さですが、実際のファイルを含むより長いパスを指すシンボリックリンクソリューションと組み合わせることができます。
専門的な知識があり、置き換えられる文字列インスタンスをさらに制御する必要がある場合は、代わりに16進エディタを使用できますsed
。
重要な作業を実行する前に、この変更をテストします。