2010-08-04 36 views
5

Một số thời gian trước đây, tôi đã viết một số tập lệnh bash cho trường của mình. Tôi nghĩ rằng nó sẽ rất thông minh để 'bảo vệ' chúng, vì vậy tôi biên soạn chúng với shc thành một tệp nhị phân. Vài tuần sau, tôi bị mất các tập lệnh chưa được biên dịch và bây giờ tôi chỉ còn lại các tệp nhị phân của mình.Truy xuất tập lệnh văn bản thuần túy từ tập lệnh bash được biên dịch

Có cách nào để truy xuất tập lệnh từ các mã nhị phân được tạo ra từ shc không? Tôi nhìn vào mã nguồn của shc để tìm cách giải mã nhị phân không may mắn.

+4

Hy vọng bạn sẽ học bài học của mình và bắt đầu sử dụng hệ thống kiểm soát phiên bản! (git là một trong những tuyệt vời) – Daenyth

Trả lời

48

Sử dụng SHC để biên dịch script của bạn không bảo vệ họ. Bạn không nhận được bảo mật hơn theo cách này. Mã nhị phân được biên dịch shc giải mã và tải tập lệnh vào bộ nhớ khi bắt đầu. Bạn có thể sau đó, ngay sau khi bạn bắt đầu nhị phân, chỉ cần segfault nó và lấy kịch bản của bạn từ coredump.

Dưới đây là một ví dụ kịch bản ít tên test.sh:

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

Biên dịch nó với SHC:

shc -f test.sh 

Bắt đầu nó như là quá trình nền và segfault nó ngay lập tức:

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

ngủ 0,2 sẽ cung cấp cho thời gian đủ nhị phân để khởi động và giải mã tập lệnh gốc. Biến $! chứa pid của quá trình nền cuối cùng bắt đầu, vì vậy chúng ta có thể dễ dàng giết nó với tín hiệu lỗi phân đoạn SIGSEGV (giống như kill -11 $!).

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

Bây giờ chúng ta có thể tìm kiếm trên bãi cho kịch bản gốc:

cat core | strings 

Chúng ống dữ liệu trong dumpfile đến chuỗi, sau đó sẽ cho chúng ta thấy tất cả các ký tự in trong tập tin và chúng tôi có thể bây giờ xem tập lệnh gốc giữa rác:

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

Nếu tập lệnh là khá lớn, có thể bạn phải điều chỉnh kích thước tệp lõi bằng ulimit. Khá dễ, phải không?

+0

Tôi sẽ bỏ phiếu này nhiều hơn một lần nếu tôi có thể. Câu trả lời chính xác! –

3

Hãy đơn giản! :)

Để truy xuất tập lệnh từ các tệp nhị phân được tạo ra shc, hãy lưu bản sao của hệ thống sh gốc có thể thực thi, sau đó đổi tên hệ thống thực thi thành sh và chạy mã nhị phân được tạo ra shc :) Vì vậy, bạn sẽ thấy nguồn giải mã kịch bản trình bao trong bảng điều khiển.

+1

Hãy cẩn thận với việc thay thế hệ thống sh, rất nhiều thứ có thể sai ... bạn có thể muốn làm điều này trong môi trường chroot –

+0

Bạn có thể giải thích chi tiết hơn – mebjas

-1

UnSHc, một tập lệnh tự động để khôi phục tệp được mã hóa * .sh.x được mã hóa bằng công cụ SHc đã được phát hành trên github here.

UnSHc là công cụ để đảo ngược mã hóa của bất kỳ tập lệnh được mã hóa SHC * .sh.x nào. Nó dựa trên tự động trích xuất tất cả dữ liệu mã hóa được nhúng trong tệp * .sh.x bằng cách đảo ngược tự động hóa nó. Với các dữ liệu mã hóa này (được sử dụng khi mã hóa), công cụ sẽ tạo lại tệp * .sh ban đầu trong bản rõ.

Làm thế nào để sử dụng 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 

trình diễn video có thể được nhìn thấy here (bằng tiếng Anh và tiếng Pháp).

+3

Liên kết đến giải pháp tiềm năng luôn được chào đón, nhưng vui lòng [thêm ngữ cảnh xung quanh liên kết] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259) để người dùng đồng nghiệp của bạn sẽ có một số ý tưởng nó là gì và tại sao nó ở đó. Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang web mục tiêu không thể truy cập được hoặc sẽ vĩnh viễn ngoại tuyến. Hãy xem xét rằng * được nhiều hơn một liên kết đến một trang web bên ngoài * là một lý do có thể là [Tại sao và làm thế nào là một số câu trả lời bị xóa?] (Http://stackoverflow.com/help/deleted-answers). –

+0

Xem xét rằng đây là trang web chỉ có tiếng Anh, một liên kết đến thông tin chỉ có sẵn bằng tiếng Pháp có vẻ không phù hợp. –

Các vấn đề liên quan