首先回顾一下历史:在我工作的地方,一些开发商/股东将他们的知识产权汇集在一起组建了公司。 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/
是您可以控制的目录。替换字符串的长度(以字节数为单位)必须等于原始字符串的长度。如果替换字符串较短,您可以用空字节填充它:(sed -i "_/foo/bar/.xyz_/contr/xyz\x00\x00\x00_g" yourbinary
、o
、l
和.
因空字节而被删除),但是此操作的成功可能取决于 的长度是否存在硬编码依赖性/foo/bar/.xyz
。或者,您可以通过添加一些/
字符 ( )来延长路径/tmp/////.xyz
。
如果替换字符串较长,则您可能无法使用这种就地修补方式。但是,如果需要,您可以将其与符号链接解决方案结合起来,其中/control/xyz
是适当长度的路径,但它指向实际文件所在的较长路径。
如果您拥有专业知识并且需要更多地控制替换字符串的哪些实例,则可以使用十六进制编辑器而不是sed
.
在做任何重要的事情之前我会测试这个改变。