【发布时间】:2020-07-26 15:27:50
【问题描述】:
如果您使用以下技术(请参阅this),则可以从 shell 脚本文件中提取任何有效负载:
#!/bin/sh
tail -n +4 > package.tgz
exec tar zxvf package.tgz
# payload comes here...
这需要一个文件,以便tail 可以将文件查找到正确的位置。
在我的特殊情况下,为了进一步自动化,我使用| sh - 模式,但它破坏了有效负载提取,因为pipes are not seekable。
我还尝试将二进制有效负载嵌入到一个heredoc中,这样我就可以做出类似的东西:
cat >package.tgz <<END
# payload comes here
END
tar zxvf package.tgz
但这会使 shell(bash 和 NetBSD 的 /bin/sh)混淆,并且无法正常工作。
我可以在 heredoc 中使用 uuencode 或 base64,但我只是想知道是否有一些 shell 魔法可用于从标准输入接收脚本和二进制数据,并从接收到的数据中提取二进制数据标准输入。
编辑:
当我的意思是外壳变得混乱时,我的意思是它可以忽略空字节或具有未定义的行为,即使在 heredoc 中也是如此。试试:
cat > /tmp/out <<EOF
$(echo 410041 | xxd -p -r)
EOF
xxd -p /tmp/out
Bash 抱怨:line 2: warning: command substitution: ignored null byte in input。
如果我将十六进制字节 410041 直接嵌入到 shell 脚本中并使用引用的 heredoc,结果会有所不同,但 bash 只会丢弃空字节。
echo '#!/bin/sh' > foo.sh
echo "cat > /tmp/out <<'EOF'" >> foo.sh
echo 410041 | xxd -p -r >> foo.sh
echo >> foo.sh
echo EOF >> foo.sh
echo 'xxd -p /tmp/out' >> foo.sh
bash /tmp/foo.sh
41410a
【问题讨论】:
-
exec tar zxvf为什么要执行?But it makes shells (both bash and NetBSD's /bin/sh) confused什么?当外壳“混乱”时是什么意思?我想tar -xzvf - <<'EOF'和EOF随机 uuidif there is som...data received from stdin.我不明白 - 这不是 XY 问题吗?您真正要解决的问题是什么?您确实没有发布了一个从标准输入读取脚本和数据的示例 - 两个代码 sn-ps 都完全忽略标准输入,并且“二进制数据”包含在文件中。 -
我编辑了问题并在最后添加了一个澄清说明。
-
是的,这就是为什么引用此处的文档分隔符。如果您不想扩展此处的文档内容,请执行
<<'EOF'或<<"EOF"。not four.我假设您希望它按字面意思输出$(echo 0a0a0a0a | xxd -p -r)。我认为你的问题太宽泛了,你问的是“一些 shell 巫术”,这对于一个 stackoverflow 问题来说太宽泛了。 -
我也尝试了用引号分隔的heredoc(我添加了四个文字0a——在vim中它们显示为^@),结果是一样的:输出只有0a。文件
/tmp/out大小只有一个字节。