2010-08-04 57 views
5

Hace algún tiempo, escribí algunos scripts bash para mi escuela. Pensé que sería muy inteligente "protegerlos", así que los compilé con shc en un archivo binario. Algunas semanas más tarde, perdí los scripts sin compilar y ahora solo me quedan mis binarios.Recuperar script de texto plano del script bash compilado

¿Hay alguna manera de recuperar las secuencias de comandos de los binarios shc? Busqué en el código fuente de shc para encontrar una manera de descompilar los binarys sin suerte.

+4

¡Esperamos que aprenda su lección y comience a usar un sistema de control de versiones! (git es genial) – Daenyth

Respuesta

48

El uso de SHC para compilar las secuencias de comandos no protegerlos. No obtienes más seguridad de esta manera. El shc compila descifrados binarios y carga el script en la memoria cuando se inicia. Entonces, justo después de que comenzó el binario, solo puede segfault y recuperar su script del coredump.

aquí hay un pequeño script de ejemplo llamado test.sh:

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

compilarlo con SHC:

shc -f test.sh 

iniciarlo como proceso en segundo plano y la violación de segmento de inmediato:

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

sleep 0.2 dará al binario el tiempo suficiente para iniciar y descifrar el script original. La variable $! contiene el pid del último proceso de fondo iniciado, por lo que podemos matarlo fácilmente con la señal de falla de segmentación SIGSEGV (igual que kill -11 $!).

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

Ahora podemos buscar el vertedero para el guión original:

cat core | strings 

tubería Nosotros los datos en el fichero de volcado a las cadenas, que a su vez nos muestran todos los caracteres imprimibles en el archivo y podemos ahora ver el guión original entre la basura:

... 
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 
... 

Si el guión es bastante grande, tal vez usted tiene que ajustar el tamaño de archivo de núcleo con ulimit. Bastante fácil, ¿verdad?

+0

Votaría esto más de una vez si pudiera. ¡Gran respuesta! –

3

¡Mantenlo simple! :)

Para recuperar los scripts de los binarios generados por el shc simplemente guarde la copia del ejecutable del sh system original, cambie el nombre del sistema de cat ejecutable a sh y ejecute el shc generado :) Así verá la fuente descifrada de el script de shell en la consola.

+1

Tenga cuidado con la sustitución del sistema sh, muchas cosas pueden salir mal ... es posible que desee hacer esto en un entorno chroot –

+0

Podría elaborar esto más – mebjas

-1

UnSHc, un script automático para recuperar * .sh.x archivo cifrado cifrado con la herramienta SHC se ha lanzado en github here.

UnSHc es una herramienta para revertir el cifrado de cualquier script * .sh.x cifrado SHC. Se basa en la extracción automática de todos los datos criptográficos incrustados en * .sh.x invirtiéndolo automáticamente. Con estos datos criptográficos (utilizados en el cifrado), la herramienta regenera el archivo * .sh inicial en texto sin formato.

Cómo usar UnSHc:

[[email protected]ver:~/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 

vídeo de demostración se puede ver here (en Inglés y francés).

+3

Un enlace a una posible solución siempre es bienvenido, pero por favor [add context alrededor del enlace] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259) para que tus compañeros usuarios tengan algo de idea de qué se trata y por qué está allí. Siempre cite la parte más relevante de un enlace importante, en caso de que el sitio objetivo no esté disponible o esté permanentemente fuera de línea. Tenga en cuenta que ser * apenas más que un enlace a un sitio externo * es una posible razón para [¿Por qué y cómo se eliminan algunas respuestas?] (Http://stackoverflow.com/help/deleted-answers). –

+0

Teniendo en cuenta que este es un sitio solo en inglés, un enlace a información disponible solo en francés parece inapropiado. –

Cuestiones relacionadas