Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在硬编码tar命令中注入参数_Linux_Shell_Tar_Code Injection - Fatal编程技术网

Linux 在硬编码tar命令中注入参数

Linux 在硬编码tar命令中注入参数,linux,shell,tar,code-injection,Linux,Shell,Tar,Code Injection,我正在使用一个linux软件解决方案,它使用tar命令备份大量数据。 硬编码为调用tar的二进制文件的命令是: /bin/tar --exclude "/backup" --exclude / --ignore-failed-read -cvjf - /pbackup 2>>'/tar_err.log' | split -b 1000m - '/backup/temp/backup.tar.bz2' 没有机会更改该命令,因为它已被加密。它使用bzip2压缩数据。在使用参数时,我体

我正在使用一个linux软件解决方案,它使用tar命令备份大量数据。 硬编码为调用tar的二进制文件的命令是:

/bin/tar --exclude "/backup" --exclude / --ignore-failed-read -cvjf - /pbackup 2>>'/tar_err.log' |  split -b 1000m - '/backup/temp/backup.tar.bz2'
没有机会更改该命令,因为它已被加密。它使用bzip2压缩数据。在使用参数时,我体验到了强大的性能提升(高达60%),即使用CompressProg=pbzip2,它利用了所有CPU核。 通过将bzip2从/bin/bzip2符号链接到pbzip2二进制文件,我试图欺骗软件,但是在监视进程时,它仍然使用bzip2,因为我发现它内置于tar中

我知道这是一个棘手的问题,但是有没有办法在不改变这个外部调用的命令的情况下使用pbzip2

我的系统是Debian Sequeeze

非常感谢

危险:前方的丑陋解决方案;在继续之前备份二进制文件

首先,检查硬编码字符串是否易于访问:在二进制文件上使用
字符串
,并查看它是否显示您所说的字符串(可能会分为多个部分,例如
/bin/tar
--排除
--忽略失败的读取
,…)

如果成功的话,抓取你选择的十六进制编辑器,打开二进制文件并查找硬编码字符串;如果它被分成几个部分,您需要的是包含
/bin/tar
的部分;使用任意三个字母的名称覆盖
tar
,例如
fkt
(伪造tar;快速谷歌搜索没有找到
/usr/bin/fkt
,因此我们应该是安全的)

程序现在应该调用您的
/usr/bin/fkt
,而不是常规的
tar

现在,在
/bin
中放入如下脚本:

#!/bin/sh
/bin/tar --use-compress-prog=pbzip2 $*
使用您之前选择的名称(
fkt
)调用它,并正确设置权限(权限应为755,并由
root
所有)。这个脚本只需要获取它得到的所有参数,并调用real
tar
,在它们前面添加您需要的参数


我在评论中建议的另一个解决方案可能是为应用程序创建一个
chroot
,将
tar
重命名为其他名称(
realtar
,可能?),并调用上面的脚本
tar
(显然现在您应该将脚本中的
/bin/tar
更改为
/bin/realtar

如果程序不经常更新,并且第一次尝试时就成功了,我可能会选择第一个解决方案,设置和维护chroots并不有趣。

为什么不将/bin/tar移动到(比如)/bin/tar原始版本


然后创建一个脚本/bin/tar,让它做任何你想做的事情。

你可以
chroot
整个过程,放入你的“假”
/bin/
一个
tar
脚本,它注入你的附加参数,并将任务转发给“真”
tar
,但是这种努力可能并不值得,只有在你不打算在机器上使用
tar
的情况下,这才是一个可行的解决方案——这是不太可能的;此外,对
tar
包的每次更新都会覆盖您的脚本(或者,更糟糕的是,会因一些奇怪的
dpkg
错误而失败)。是的,我也考虑过这一点,但正如Matteo所说,这将导致我系统上几乎所有其他内容都不兼容。无论如何,谢谢。非常聪明的解决方案,谢谢。我按照您的指示,找到了--ignore failed read字符串,添加了pbzip2字符串,然后收到警告说此操作将更改文件大小,忽略并尝试执行,结果是:Segmentation fault。这是一个很好的尝试,那么我们又能做什么来让二进制工作呢?我明确地说只修改<代码> /BI/TAR < /Code >字符串,并且只覆盖字符串,因为在二进制的中间插入字符使得它不起作用(改变数据段中的偏移量,但不修复代码中的偏移)。如果您进行了备份,请先还原它,否则请尝试使用十六进制编辑器还原二进制文件的先前状态。无论如何,您没有找到
/bin/tar
字符串吗?或者,更简单地说,
tar
?(要通过
strings
显示,您必须将其最小字符串长度更改为3)好的,对不起。我改变了它,二进制代码又开始工作了。但是,现在根本不创建存档。从shell调用fkt将显示正确的tar答案。奇怪<代码>“/bin/fkt”--exclude“/backup”--exclude/--ignore failed read-cvjf-/root 2>>”/tar|u err.log'| split-b 1000m-'/backup/temp/backup.tar.bz2'
现在是命令。tar_err.log打印:/bin/tar:kompressionoptionen schließen sich gegenseitig aus。»/bin/tar——帮助«订单»/bin/tar——用法«gibt weitere Informationen。这意味着压缩方法不能一起工作?奇怪。