Получить текстовый скрипт из скомпилированного скрипта bash - PullRequest
5 голосов
/ 04 августа 2010

Некоторое время назад я написал несколько сценариев bash для своей школы. Я подумал, что было бы очень разумно «защитить» их, поэтому я скомпилировал их с shc в двоичный файл. Несколько недель спустя я потерял не скомпилированные скрипты, и теперь у меня остались только мои бинарные файлы.

Есть ли способ получить сценарии обратно из сгенерированных shc бинарных файлов? Я заглянул в исходный код shc, чтобы найти способ безуспешно декомпилировать бинарные файлы.

Ответы [ 4 ]

51 голосов
/ 04 августа 2010

Использование shc для компиляции ваших скриптов не защищает их.Вы не получаете больше безопасности таким образом.Скомпилированный двоичный файл shc расшифровывает и загружает скрипт в память при запуске.Затем вы можете сразу после запуска бинарного файла просто выполнить его сегрегацию и извлечь свой скрипт из coredump.

Вот небольшой пример скрипта с именем test.sh:

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

Скомпилируйте его с помощьюshc:

shc -f test.sh

Запустите его как фоновый процесс и сразу же запустите segfault:

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

sleep 0.2 даст двоичному времени достаточно для запуска и расшифровки исходного скрипта.Переменная $!содержит pid последнего запущенного фонового процесса, поэтому мы можем легко уничтожить его с помощью сигнала ошибки сегментации SIGSEGV (аналогично kill -11 $!).

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

Теперь мы можем искать в оригинале дампscript:

cat core | strings

Мы передаем данные из файла дампа в строки, которые затем показывают нам все печатаемые символы в файле, и теперь мы можем видеть оригинальный скрипт между мусором:

...
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.Довольно просто, правда?

3 голосов
/ 13 августа 2013

Будьте проще! :)

Чтобы извлечь сценарии обратно из сгенерированных shc двоичных файлов, просто сохраните копию исходного исполняемого файла sh system, затем переименуйте исполняемый файл cat system в sh и запустите сгенерированный двоичный файл shc :) Таким образом, вы увидите расшифрованный источник сценария оболочки в консоли.

1 голос
/ 04 августа 2010

Просто предположение ... вы можете записывать системные вызовы, используя, например, strace или что-то подобное, а затем пытаться восстановить хотя бы базовую функциональность.

Или вы можете попросить автора shc (http://www.datsi.fi.upm.es/~frosal/sources/shc.html).

PS

Ходят слухи, что кто-то написал deshc (http://www.linuxjournal.com/article/8256)

0 голосов
/ 11 июля 2016

UnSHc, автоматический скрипт для восстановления * .sh.x зашифрованного файла, зашифрованного с помощью инструмента SHc, был выпущен на github здесь .

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

Можно увидеть демонстрационное видео здесь (на английском и французском).

...