1. Установка shc на CentOS
Ставим gcc, скачиваем и устанавливаем shc
[root@centos ~]# yum install gcc
[root@centos ~]# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
[root@centos ~]# tar xvfz shc-3.8.7.tgz
[root@centos ~]# cd shc-3.8.7
[root@centos shc-3.8.7]# make
2. Шифрование
Создаём скрипт
[root@centos shc-3.8.7]# nano script.sh
#!/bin/bash
echo "Preved Medved !!!"
Преобразуем его при помощи shc
[root@localhost shc-3.8.7]# ./shc -r -v -T -f ./script.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc ./script.sh.x.c -o ./script.sh.x
shc: strip ./script.sh.x
shc: chmod go-r ./script.sh.x
-r — возможность запускать на других машинах;
-v — подробный вывод при компиляции;
-T — разрешить трассировку скрипта. Без этой опции можно получить ошибку “(command): Operation not permitted” при запуске не из под рута;
**-f **— путь к файлу скрипта.
В результате имеем
[root@localhost shc-3.8.7]# ls -lh script*
-rw-r--r--. 1 root root 37 Окт 28 21:21 script.sh
-rwx--x--x. 1 root root 9,2K Окт 28 21:25 script.sh.x
-rw-r--r--. 1 root root 9,5K Окт 28 21:25 script.sh.x.c
- script.sh.x.c — нечитабельный код на C, вместе с текстом скрипта, шифрованным при помощи RC4
- script.sh.x — скомпилированный бинарник
3. Запуск
Запустим полученный бинарник
[root@localhost shc-3.8.7]# ./script.sh.x
Preved Medved !!!
[root@localhost shc-3.8.7]#
Перенесём бинарник на другую машину и попробуем запустить
Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
root@debian:~# ls
script.sh.x
root@debian:~# ./script.sh.x
Preved Medved !!!
root@debian:~#
Видим, что скрипт отработал.
4. Дешифрование
Процесс дешифрования для shc версии 3.7 описан ещё в 2005 году, однако есть более простой путь получения исходного текста скрипта. Т.к. при выполнении бинарника происходит его расшифровка в оперативную память, достаточно сдампить и проанализировать данный участок памяти.
Убираем лимит на размер дампа
root@debian:~# ulimit -c unlimited
Выполняем команду
root@debian:~# ./script.sh.x& ( sleep 0.001 && kill -SIGSEGV $! )
[1] 13315
root@debian:~#
[1]+ Segmentation fault (core dumped) ./script.sh.x
Здесь важно подобрать такой интервал времени (sleep 0.001), чтобы скрипт успел выгрузиться в память, но не успел завершиться.
**$! **— будет содержать PID запущенного процесса
kill -SIGSEGV — вызовет ошибку “Segmentation fault “ выгрузку памяти в дамп.
В результате в каталоге со скриптом имеем файл “core “
root@debian:~# ls -lh
total 96K
-rw------- 1 root root 212K Oct 30 16:20 core
-rwxr--r-- 1 root root 9.2K Oct 28 13:25 script.sh.x
В котором несложно найти текст исходного скрипта