
एक Bash/Batch/PowerShell बहुभाषी!
PolyShell एक स्क्रिप्ट है जो Bash, Windows Batch और PowerShell में एक साथ मान्य है (अर्थात पॉलीग्लॉट)।
यह PolyShell को पैनेट्रेशन टेस्टिंग के लिए एक उपयोगी टेम्पलेट बनाता है क्योंकि इसे लक्ष्य-विशिष्ट पेलोड की आवश्यकता के बिना अधिकांश सिस्टम पर निष्पादित किया जा सकता है। PolyShell को विशेष रूप से USB Rubby Ducky, MalDuino, या इसी तरह के उपकरण का उपयोग करके इनपुट इंजेक्शन के माध्यम से वितरित करने योग्य बनाया गया है।

.sh, .bat, या .ps1) हो।exit चलाएं।इनपुट इंजेक्शन विधि स्क्रिप्ट विधि से थोड़ी अलग व्यवहार करेगी। जब एक स्क्रिप्ट के रूप में चलाया जाता है, तो पेलोड किसी भाषा के प्रोसेस होते ही तुरंत बाहर निकल जाता है। जब इंजेक्शन के माध्यम से वितरित किया जाता है, तो पेलोड इसके बजाय एक रीड लूप चलाता है। इसके बिना, पेलोड टर्मिनल विंडो को बंद कर देगा लेकिन इसके बजाय एक अज्ञात विंडो में टाइप करना जारी रखेगा। Ctrl-C स्क्रिप्ट को रीड लूप से बाहर निकालता है, जिससे यह बिना अनपेक्षित दुष्प्रभावों के चल सके।
इसके अलावा, स्क्रिप्ट को टर्मिनल में पेस्ट करना विफल हो सकता है। जब स्क्रिप्ट रीड लूप तक पहुँचती है, तो कुछ टर्मिनल शेष पेस्ट किए गए टेक्स्ट को रीड लूप के इनपुट के रूप में मानेंगे (अच्छा), लेकिन अन्य रीड लूप से बाहर निकलने पर स्क्रिप्ट को निष्पादित करना जारी रख सकते हैं (बुरा)।
मुख्य तरकीब यह है कि जब हम केवल उनमें से किसी एक के लिए विशिष्ट कोड चलाना चाहते हैं, तो प्रत्येक अन्य भाषा को "दूर देखने" के लिए प्रेरित किया जाए। यह कोटिंग, रीडायरेक्शन और टिप्पणियों से संबंधित भाषा विशिष्टताओं का दोहन करके प्राप्त किया जाता है।
निम्नलिखित पंक्ति पर विचार करें:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
प्रत्येक भाषा echo कमांड को देखती है, लेकिन शेष पंक्ति की अलग-अलग व्याख्या करेगी।
उदाहरण के लिए, प्रत्येक भाषा एक स्ट्रिंग के रूप में इस प्रकार की व्याख्या करेगी:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
पंक्ति निष्पादित करने के बाद, bash स्क्रिप्ट एक here document में होगी, PowerShell स्क्रिप्ट एक मल्टीलाइन-कमेंट में होगी, और बैच स्क्रिप्ट सामान्य रूप से निष्पादित होती रहेगी। प्रत्येक भाषा के निष्पादन समाप्त होने के बाद, हम इसे समाप्त कर देते हैं। यह हमें स्क्रिप्ट में बाद में इसकी विशिष्टताओं के आसपास काम करने की आवश्यकता से बचाता है।
स्पष्ट रूप से, इस पॉलीग्लॉट को बनाने के लिए आवश्यक तरकीबें सामान्य कोडिंग परंपराओं का पालन नहीं करती हैं।
ऐसी कई विशिष्टताएँ हैं जिनका लाभ उठाया गया या जिनके आसपास काम करना पड़ा:
\)^)`)< और >) सभी तीन भाषाओं में विशेष अर्थ रखते हैं जब तक उद्धृत न किए जाएं।echo >output.txt "Hello World"> को एक रीडायरेक्ट के रूप में मानता है भले ही वह सीधे स्ट्रिंग को छूता हो, लेकिन PowerShell ऐसा नहीं करता।GOTO स्टेटमेंट केवल स्क्रिप्ट के रूप में चलाए जाने पर काम करते हैं, इंटरैक्टिव रूप से चलाए जाने पर नहीं।<#) से तुरंत पहले व्हाइटस्पेस होना चाहिए।