2010-08-04 16 views
5

Qualche tempo fa, ho scritto alcuni script di bash per la mia scuola. Ho pensato che sarebbe stato molto intelligente "proteggerli", quindi li ho compilati con shc in un file binario. Alcune settimane dopo, ho perso gli script non compilati e ora ho solo i miei binarys rimasti.Recupera script di testo semplice da script bash compilato

C'è un modo per recuperare gli script dai binarys generati da shc? Ho esaminato il codice sorgente di shc per trovare un modo per decompilare i binarys senza fortuna.

+4

Speriamo che tu abbia imparato la lezione e inizi a utilizzare un sistema di controllo della versione! (git è fantastico) – Daenyth

risposta

48

Utilizzando SHC per compilare i vostri script non proteggerli. Non ottieni più sicurezza in questo modo. Lo shc ha compilato decodifiche binarie e carica lo script in memoria quando viene avviato. Potresti quindi, subito dopo aver avviato il binario, solo segfault e recuperare il tuo script dal coredump.

Ecco uno script di esempio po 'di nome test.sh:

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

compilarlo con SHC:

shc -f test.sh 

avviarlo come processo in background e SEGFAULT subito:

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

sleep 0.2 darà al file binario il tempo sufficiente per avviare e decrittografare lo script originale. La variabile $! contiene il pid dell'ultimo processo in background avviato, quindi possiamo facilmente ucciderlo con il segnale di errore di segmentazione SIGSEGV (come kill -11 $!).

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

Ora possiamo cercare la discarica per lo script originale:

cat core | strings 

Abbiamo pipe i dati contenuti nel file di dump in stringhe, che poi ci mostrerà tutti i caratteri stampabili nel file e possiamo ora vedere lo script originale tra la spazzatura:

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

Se lo script è abbastanza grande, forse è necessario regolare la dimensione del file core con ulimit. Abbastanza facile, vero?

+0

Ho votato più di una volta se potessi. Bella risposta! –

3

Semplicità! :)

Per recuperare gli script dai binari generati da shc basta salvare la copia del file system sh originale, quindi rinominare l'eseguibile del sistema cat in sh ed eseguire il file binario generato da shc :) Quindi vedrai la sorgente decodificata di lo script della shell nella console.

+1

Si prega di stare attenti con la sostituzione del sistema sh, molto può andare storto ... si potrebbe voler fare questo in un ambiente chroot –

+0

Potresti elaborare questo più – mebjas

-1

UnSHc, uno script automatico per il recupero del file crittografato * .sh.x crittografato con lo strumento SHc è stato rilasciato su github here.

UnSHc è uno strumento per invertire la crittografia di qualsiasi script * .sh.x crittografato con SHc. Si basa sull'auto-estrazione di tutti i dati crittografici incorporati nel * .sh.x invertendola automaticamente. Con questi dati crittografici (utilizzati per la crittografia), lo strumento rigenera il file * .sh iniziale in testo semplice.

Come utilizzare UnSHc:

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

il video dimostrativo può essere visto here (in inglese e francese).

+3

Un collegamento ad una potenziale soluzione è sempre il benvenuto, ma per favore [aggiungi contesto intorno al link] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259) così i tuoi utenti avranno un po 'di idea di cosa sia e perché è lì. Citare sempre la parte più rilevante di un link importante, nel caso in cui il sito target non sia raggiungibile o sia permanentemente offline. Tieni presente che essere * appena più di un link a un sito esterno * è una possibile ragione per [Perché e come vengono eliminate alcune risposte?] (Http://stackoverflow.com/help/deleted-answers). –

+0

Considerando che si tratta di un sito solo in inglese, un collegamento alle informazioni disponibili solo in francese sembra inappropriato. –