
MD5-Monomorphic Shellcode Packer - सभी पेलोड का MD5 हैश समान होता है
════════════════════════════════════╦═══
╔═╦═╗ ╔═╗ ╔═╗ ╔═╗ ╔═╦═╗ ╔═╗ ╔══╔═╗ ╠═╗
═╩ ╩ ╩═╚═╝═╩ ╩═╚═╝═╩ ╩ ╩═╚═╝═╩ ╠═╝═╩ ╩═
════════════════════════════════╩═══════
By Retr0id
═══ MD5-Monomorphic Shellcode Packer ═══
उपयोग: python3 monomorph.py input_file output_file [payload_file]
## यह क्या करता है?
यह 4KB तक के संपीड़ित शेलकोड को लगभग तुरंत एक निष्पादन योग्य बाइनरी में पैक करता है। आउटपुट फ़ाइल का MD5 हैश *हमेशा* समान होगा: `3cebbe60d91ce760409bbe513593e401`
वर्तमान में, केवल Linux x86-64 समर्थित है। इस तकनीक को अन्य प्लेटफ़ॉर्मों पर पोर्ट करना आसान होगा, हालाँकि प्रत्येक संस्करण का MD5 अलग होगा। [APE](https://justine.lol/ape.html) जैसी मल्टी-प्लेटफ़ॉर्म पॉलीग्लॉट फ़ाइल का उपयोग करना भी संभव होगा।
उदाहरण उपयोग:
$ python3 monomorph.py bin/monomorph.linux.x86-64.benign bin/monomorph.linux.x86-64.meterpreter sample_payloads/bin/linux.x64.meterpreter.bind_tcp.bin
## क्यों?
लोगों ने [पहले](https://www.mscs.dal.ca/~selinger/md5collision/) एकल टकरावों का उपयोग करके बाइनरी को "अच्छे" और "बुरे" मोड के बीच टॉगल किया है। मोनोमॉर्फ इस अवधारणा को अगले स्तर पर ले जाता है।
कुछ लोग अभी भी विभिन्न कारणों से फ़ाइल नमूनों को संदर्भित करने के लिए MD5 का उपयोग करने पर जोर देते हैं, जो मुझे समझ में नहीं आते। यदि इनमें से कोई भी व्यक्ति मोनोमॉर्फ का उपयोग करके पैक किए गए कोड की जाँच करता है, तो वे बहुत भ्रमित हो जाएंगे।
## यह कैसे काम करता है?
हम जिस प्रत्येक बिट को एन्कोड करना चाहते हैं, उसके लिए [FastColl](https://github.com/cr-marcstevens/hashclash/tree/master/src/md5fastcoll) का उपयोग करके एक टकराव MD5 ब्लॉक पूर्व-गणना किया गया है। जैसा कि [यहाँ](https://github.com/corkami/collisions/tree/master/hashquines#read-an-encoded-value) संक्षेप में बताया गया है, प्रत्येक टकराव हमें ब्लॉकों की एक जोड़ी देता है जिसे हम समग्र MD5 हैश को बदले बिना बदल सकते हैं। लोडर रनटाइम पर जाँचता है कि कौन सा ब्लॉक चुना गया था, बिट को डीकोड करने के लिए।
4KB डेटा को एन्कोड करने के लिए, हमें 4*1024*8 टकराव उत्पन्न करने की आवश्यकता है (जिसमें कुछ घंटे लगते हैं), अंतिम फ़ाइल में 4MB स्थान लेता है।
इसे गति देने के लिए, मैंने FastColl में कुछ छोटे बदलाव किए ताकि यह व्यवहार में और भी तेज़ हो सके, जिससे इसे समानांतर में चलाया जा सके। मुझे यकीन है कि इसे समानांतर करने के लिए और भी स्मार्ट तरीके हैं, लेकिन मेरा सरल दृष्टिकोण एक साथ N इंस्टेंस शुरू करना और पहले पूरा होने की प्रतीक्षा करना है, फिर बाकी सभी को मार देना है।
चूँकि मैंने पहले से ही पूर्व-गणना कर ली है, पेलोड को फिर से कॉन्फ़िगर करना लगभग तुरंत किया जा सकता है। पूर्व-गणना किए गए ब्लॉकों की स्थिति को बदलना [Ange Albertini](https://github.com/corkami/collisions/blob/master/hashquines/scripts/collisions.py) द्वारा लागू एक तकनीक का उपयोग करके किया जाता है।
## क्या यह पता लगाने योग्य है?
हाँ। यह बिल्कुल भी गुप्त नहीं है, न ही ऐसा होने का प्रयास करता है। आप [detectcoll](https://github.com/cr-marcstevens/hashclash/tree/collisiondetection/src/collisiondetection) का उपयोग करके टकराव ब्लॉकों का पता लगा सकते हैं।