从已编译的bash脚本中检索纯文本脚本

时间:2010-08-04 18:02:37

标签: linux bash scripting compilation

前段时间,我为我的学校写了一些bash脚本。我认为“保护”它们会非常聪明,所以我用shc将它们编译成二进制文件。几周后,我丢失了未编译的脚本,现在我只剩下我的二进制文件了。

有没有办法从shc生成的二进制文件中检索脚本?我查看了shc的源代码,找到了一种没有运气反编译binarys的方法。

4 个答案:

答案 0 :(得分:51)

使用shc编译脚本不会保护它们。你不会以这种方式获得更多安全性。 shc编译的二进制文件解密并在启动时将脚本加载到内存中。然后,您可以在启动二进制文件后立即对其进行分段并从coredump中检索脚本。

这是一个名为test.sh的小例子脚本:

#! /bin/bash
echo "starting script and doing stuff"
sleep 1
echo "finished doing stuff"

用shc编译:

shc -f test.sh

将其作为后台进程启动并立即进行分段:

./test.sh.x&  ( sleep 0.2 && kill -SIGSEGV $! )

sleep 0.2将为二进制文件提供足够的时间来启动和解密原始脚本。变量$!包含最后一个后台进程启动的pid,因此我们可以使用分段故障信号SIGSEGV轻松杀死它(与kill -11 $相同!)。

[1]  + segmentation fault (core dumped)  ./test.sh.x

现在我们可以在转储中搜索原始脚本:

cat core | strings

我们将dumpfile中的数据传递给字符串,然后将向我们显示文件中的所有可打印字符,现在我们可以看到垃圾之间的原始脚本:

...
4.0.37(2)-release
BASH_VERSINFO
BASH_VERSINFO
release
i686-pc-linux-gnu
BASH_EXECUTION_STRING
BASH_EXECUTION_STRING
                           #! /bin/bash
echo "starting script and doing stuff"
sleep 1
echo "finished doing stuff"
1000
EUID
EUID
1000
...

如果脚本很大,可能你必须用ulimit调整核心文件大小。 很简单吧?

答案 1 :(得分:3)

保持简单! :)

要从shc生成的二进制文件中检索脚本,只需保存原始sh系统可执行文件的副本,然后将cat系统可执行文件重命名为sh并运行shc生成的二进制文件:) 因此,您将在控制台中看到解密的shell脚本源。

答案 2 :(得分:1)

只是猜测..您可以使用例如 strace 或类似的东西录制系统调用,然后尝试至少恢复基本功能。

或者,您可以询问 shc http://www.datsi.fi.upm.es/~frosal/sources/shc.html)的作者。

PS

谣言说有人写了deshc(http://www.linuxjournal.com/article/8256

答案 3 :(得分:-1)

UnSHc是一个自动脚本,用于恢复使用SHc工具加密的* .sh.x加密文件,已在github here上发布。

UnSHc是一种反转任何SHc加密* .sh.x脚本加密的工具。它基于通过自动反转来自动提取* .sh.x中嵌入的所有加密数据。使用这些加密数据(用于加密),该工具以纯文本重新生成初始* .sh文件。

如何使用UnSHc:

[root@server:~/unshc]$ ./unshc.sh -h
 _   _       _____ _   _
| | | |     /  ___| | | |
| | | |_ __ \ `--.| |_| | ___
| | | | '_ \ `--. \  _  |/ __|
| |_| | | | /\__/ / | | | (__
 \___/|_| |_\____/\_| |_/\___|

--- UnSHc - The shc decrypter.
--- Version: 0.6
------------------------------
UnSHc is used to decrypt script encrypted with SHc
Original idea from Luiz Octavio Duarte (LOD)
Updated and modernized by Yann CAM
- SHc   : [http://www.datsi.fi.upm.es/~frosal/]
- UnSHc : [https://www.asafety.fr/unshc-the-shc-decrypter/]
------------------------------

[*] Usage : ./unshc.sh [OPTIONS] <file.sh.x>
         -h | --help                          : print this help message
         -a OFFSET | --arc4 OFFSET            : specify the arc4() offset arbitrarily (without 0x prefix)
         -d DUMPFILE | --dumpfile DUMPFILE    : provide an object dump file (objdump -D script.sh.x > DUMPFILE)
         -s STRFILE | --stringfile STRFILE    : provide a string dump file (objdump -s script.sh.x > STRFILE)
         -o OUTFILE | --outputfile OUTFILE    : indicate the output file name

[*] e.g :
        ./unshc.sh script.sh.x
        ./unshc.sh script.sh.x -o script_decrypted.sh
        ./unshc.sh script.sh.x -a 400f9b
        ./unshc.sh script.sh.x -d /tmp/dumpfile -s /tmp/strfile
        ./unshc.sh script.sh.x -a 400f9b -d /tmp/dumpfile -s /tmp/strfile -o script_decrypted.sh

可以看到演示视频here(英文和法文)。