2015-01-10 7 views
7

मैं कुछ eval कोड भर में आया था? मैंने वेब पर खोजने की कोशिश की है, लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि इसका क्या अर्थ है। मुझे यह बहुत ही रोचक लगता है और यह जानना चाहेगा कि कैसे/कैसे सीखता है कि पूर्णांक की बजाय अलग-अलग चीज़ों को कैसे मुद्रित किया जाए। पत्र, प्रतीक और इत्यादि। चूंकि मैं उस कोड में पैटर्न को इंगित नहीं कर सकता हूं, मेरे पास 0 है अलग-अलग परिणाम बनाने के लिए सफलता लेना और इसमें जोड़ना।जावास्क्रिप्ट eval - obfuscation? क्या बात के इस प्रकार कहा जाता है</p> <pre><code>eval('[+!+[]+!+[]+!+[]+!+[]+!+[]]'); </code></pre> <p>इस कोड को पूर्णांक 5.</p> <p>बराबर है:

क्या यह किसी प्रकार का अपवित्रता है?

+0

@thefourtheye ठीक है, मैं ठीक किया मानी :-) – Mouser

+0

मैं (के रूप में मैंने देखा है/इसके बारे में पढ़ा परिचित) उस भाषा से परिचित हूँ। यह eval कोड विशेष रूप से जावास्क्रिप्ट है। जब तक मैं गलत नहीं हूं, और संभवतः, जावास्क्रिप्ट और brainf *** का कोई संबंध नहीं है। ब्रेनफ *** मनोरंजन के अलावा किसी वास्तविक उपयोग की गूढ़ भाषा नहीं है। हालांकि इस मामले में, मेरे लिए यह eval चीज पूरी तरह से मनोरंजन के लिए भी है। शायद थोड़ा सा ज्ञान भी। – odran037

उत्तर

8

कहानियो को इस प्रकार का eval() एक तरफ, गैर अक्षरांकीय कहानियो के रूप में जाना जाता है। पूरी तरह से गैर अक्षरांकीय होने के लिए, eval सरणी निर्माता प्रोटोटाइप कार्य करता है और सबस्क्रिप्ट अंकन द्वारा किया जा करने के लिए होगा:

[]["sort"]["constructor"]("string to be evaled"); 

ये तार तो गैर-शब्दसंख्यात्क रूप में बदल रही हैं।

AFAIK, यह पहली बार 2009 के आसपास Yosuke Hosogawa द्वारा प्रस्तावित किया गया था। आप कार्य करते हुए देखना चाहते हैं तो इस उपकरण देखें: http://www.jsfuck.com/

यह है क्योंकि यह भी कोड को चलाने के लिए बिना, वापस मूल स्रोत कोड को उल्टा करने के लिए आसान है कहानियो का एक अच्छा प्रकार नहीं माना जाता है (स्थिर) । इसके अलावा, यह फ़ाइल आकार को काफी बढ़ा देता है।

लेकिन यह अपरिवर्तनीयता का एक दिलचस्प रूप है जो जावास्क्रिप्ट प्रकार जबरदस्ती की पड़ताल करता है। यह मैं इस प्रस्तुति की सिफारिश के बारे में अधिक जानने के लिए स्लाइड 33: http://www.slideshare.net/auditmark/owasp-eu-tour-2013-lisbon-pedro-fortuna-protecting-java-script-source-code-using-obfuscation

2

5 के रूप में मूल्य प्राप्त करने के लिए, अभिव्यक्ति इस

+[!+[] + !+[] + !+[] + !+[] + !+[]] 

की तरह किया जाना चाहिए था हमें पहले आम तत्वों का विश्लेषण करते हैं। !+[]

  1. जावास्क्रिप्ट में एक खाली सरणी शाब्दिक को फाल्सी माना जाता है।

  2. + ऑपरेटर शाब्दिक शृंखला के लिए आवेदन किया है, यह एक संख्या में बदल जाएंगे और बाद से यह खाली है, जावास्क्रिप्ट true को 0 धर्मान्तरित करने के लिए 0.

  3. ! ऑपरेटर इसका मूल्यांकन करेंगे की कोशिश करेंगे।

तो,

console.log(!+[]); 

true प्रिंट होगा। अब, अभिव्यक्ति इस

+[true + true + true + true + true] 

true के बाद से गणित भाव में 1 के रूप में व्यवहार किया जाता है की तरह कम किया जा सकता है, वास्तविक अभिव्यक्ति

+[ 5 ] 

+ ऑपरेटर एक करने के लिए सरणी ([ 5 ]) में परिवर्तित हो जाता है की कोशिश करता है संख्या और जिसके परिणाम 5 में हैं। यही कारण है कि आप 5 प्राप्त कर रहे हैं।

+0

सवाल यह है कि इस तकनीक को क्या कहा जाता है (यदि कुछ भी हो), यह कैसे काम करता है या क्यों नहीं। – Ixrec

+0

फिर भी, लेकिन फिर भी सहायक। मैंने इसे सच + सच के रूप में नहीं सोचा था .. हालांकि मुझे लगता है कि संख्या 5 प्राप्त करने के लिए चीजों की व्यवस्था करने की कुछ विधि थी या उस मामले के लिए कोई भी संख्या। प्रश्न यह था कि अन्य पूर्णांक, अक्षरों और प्रतीकों को कैसे प्राप्त किया जाए। – odran037

1

मुझे इस प्रकार के कोड का वर्णन करने के लिए इस्तेमाल किए गए किसी भी शब्द के बारे में पता नहीं है, "अपमानजनक eval()" से अलग।

मैं इस बहुत ही दिलचस्प खोजने के लिए और जानना चाहते हैं जहां/कैसे एक सीखता कैसे सिर्फ पूर्णांक 5. पत्र, प्रतीकों और आदि के बजाय अलग अलग बातें मुद्रित करने के लिए जब से मैं एक पैटर्न बिंदु पिन नहीं कर सकते उस कोड मेंपरिणाम बनाने के लिए मुझे 0 सफलताएं मिल रही हैं और इसमें शामिल किया गया है।

इस भाग में मैं कम से कम आंशिक रूप से उत्तर दे सकता हूं। Eval() आप चिपकाया जावास्क्रिप्ट के अजीब प्रकार जबरन नियमों पर भारी निर्भर करता है। वेब पर पृष्ठों के लॉट हैं जो जबरन नियमों के विभिन्न अजीब परिणामों का वर्णन करते हैं, जिन्हें आप आसानी से खोज सकते हैं।लेकिन जब तक आप this video by Destroy All Software (जावास्क्रिप्ट भाग 1:20 पर शुरू होता है) तक, "eval() जैसी चीज़ों से" आश्चर्यजनक "आउटपुट प्राप्त करने के विशिष्ट लक्ष्य के साथ टाइप जबरन पर कोई संदर्भ नहीं मिल रहा है। उनमें से ज्यादातर समझते हैं कि आपके कोड में अजीब बग से कैसे बचें। आपके उद्देश्य के लिए, मुझे विश्वास है कि मुझे सबसे उपयोगी चीजें हैं:

  • ! ऑपरेटर किसी भी बुलियन में कनवर्ट करेगा।
  • यूनरी + ऑपरेटर किसी भी संख्या को किसी भी रूप में परिवर्तित कर देगा।
  • बाइनरी + ऑपरेटर अपने तर्कों को जोड़ने या जोड़ने से पहले संख्याओं या स्ट्रिंग्स को इसके साथ जोड़ देगा। आम तौर पर यह केवल तारों के साथ ही जाएगा यदि एक या अन्य तर्क पहले से ही एक स्ट्रिंग है, लेकिन अपवाद हैं।
  • इनपुट के बावजूद बिटवाई ऑपरेटरों आउटपुट पूर्णांक।
  • संख्याओं में कनवर्ट करना जटिल है। बूलियन 0 या 1 पर जायेंगे। स्ट्रिंग्स parseInt() का उपयोग करने का प्रयास करेंगे, या अगर विफल हो जाए तो NaN का उत्पादन करेंगे। मैं बाकी को भूल जाता हूँ।
  • एक स्ट्रिंग या संख्या के लिए एक वस्तु परिवर्तित क्रमशः अपने "toString" या "toValue" विधि लागू करेगा, यदि कोई मौजूद है।

आप अंदाजा हो। Thefourtheye का जवाब ठीक से चलता है कि आपके द्वारा दिए गए उदाहरण पर ये नियम कैसे लागू होते हैं। मैं संक्षेप में यह भी करने की कोशिश नहीं कर रहा हूं कि दिनांक, कार्य, और रेगेक्स शामिल होने पर क्या होता है।

इस कहानियो को किसी प्रकार की है?

आम तौर पर आपको मिलिफिकेशन के हिस्से के रूप में मुफ्त में obfuscation मिल जाएगा, इसलिए मुझे नहीं पता कि कोई वास्तविक उत्पादन कोड में क्यों लिखता है (माना जाता है कि यह कहां मिला है)।

+0

यह मदद करता है। यह नहीं जानना कि इसे क्या कहा गया था या वास्तव में इसके बारे में कुछ भी, इसे खोजना और कुछ भी दूरस्थ रूप से बंद करना मुश्किल हो गया। मुझे याद नहीं आया कि मुझे यह कहां मिला। लेकिन मैं इस साइट पर आया: http://blog.mgechev.com/about/ उसका eval कोड उसका नाम प्रिंट करता है। मैं भी नहीं देख सकता कि इसका उत्पादन क्यों किया जाएगा। – odran037

4

इसे गैर-अल्फान्यूमेरिक जावास्क्रिप्ट कहा जाता है और यह जावास्क्रिप्ट प्रकार जबरन क्षमताओं के कारण संभव है।

[]["filter"]["constructor"]('[+!+[]+!+[]+!+[]+!+[]+!+[]]')() 

के बाद आप तार "फिल्टर" और "निर्माता" की जगह गैर-शब्दसंख्यात्क अभ्यावेदन द्वारा आप अपना पूरा गैर अक्षरांकीय जावास्क्रिप्ट है: वहाँ वास्तव में अल्फा वर्ण का उपयोग किए बिना eval/समारोह कॉल करने के लिए कुछ तरीके हैं।

आप इस के साथ चारों ओर खेलने के लिए चाहते हैं, तो एक साइट है जहाँ आप यह कर सकते हैं है: http://www.jsfuck.com/

चेक निम्नलिखित की तरह अधिक उदाहरण के लिए इस https://github.com/aemkei/jsfuck/blob/master/jsfuck.js:

'a': '(false+"")[1]', 
'b': '(Function("return{}")()+"")[2]', 
'c': '([]["filter"]+"")[3]', 
... 
संबंधित मुद्दे