
एक सरल PoC जो एक छिपे हुए कॉल का उपयोग करके एक एन्क्रिप्टेड शेलकोड को लागू करता है।
एक सरल PoC जो एक छिपे हुए कॉल का उपयोग करके एन्क्रिप्टेड शेलकोड को आमंत्रित करता है।
यह कोड एक सरल ट्रिक का उपयोग करता है जो उस निर्देश को छुपाता है जो प्रभावी रूप से हमारे शेलकोड पर कूदेगा। इससे स्थैतिक विश्लेषण या अनुकरण अधिक चुनौतीपूर्ण हो जाना चाहिए।
हमेशा की तरह, यदि यह अवधारणा पहले से किसी अन्य पेपर में समझाई गई है तो कृपया मुझे एक संदेश भेजें और मैं खुशी-खुशी इसे संदर्भों में जोड़ दूंगा।
इस तकनीक का उपयोग करने के लिए मेमोरी लेआउट मानक है और चित्र 1 में वर्णित है।
┌───────────────────────────────┐
│ │
│ │
│ │
│ │
│ encrypted shellcode │
│ │
│ │
│ │
│ │
│ │
│ │
├───────────────────────────────┤
│ │
│ │
│ decryption loop │
│ │
│ │
└───────────────────────────────┘
चित्र1. मेमोरी लेआउट
डिक्रिप्शन लूप शेलकोड को डिक्रिप्ट करेगा और उस पर कूदेगा। सारा "जादू" डिक्रिप्शन लूप के अंदर है, क्योंकि शेलकोड को डिक्रिप्ट करने के बाद, डिक्रिप्शन लूप अपने स्वयं के कोड को डिक्रिप्ट करना शुरू कर देगा। पहले निर्देश का डिक्रिप्शन हमारे शेलकोड पर एक कूद का परिणाम देगा जो अगले लूप पुनरावृत्ति पर निष्पादित होगा :)
नीचे प्रासंगिक भाग:
@decryption:
xor word ptr [eax], 06799h ; <jmp esi bytes> XOR <first two bytes of this instruction>
add eax, sizeof word
dec ecx
loop @decryption
जैसा कि आप देख सकते हैं, डिक्रिप्शन लूप में कोई भी निर्देश नहीं है जो डिक्रिप्ट किए गए शेलकोड पर कूदता है। असेंबली कोड निम्नलिखित बाइनरी प्रारूप में असेंबल किया गया है:
66:8130 9967 | xor word ptr ds:[eax],6799
83C0 02 | add eax,2
49 | dec ecx
E2 F5 | loop 450006
इस मामले में, डिक्रिप्शन कुंजी 06799h होनी चाहिए, क्योंकि 8166h (डिक्रिप्शन लूप के पहले निर्देश के पहले दो बाइट) और 6799h (XOR कुंजी) के बीच XOR ऑपरेशन e6ffh है जो jmp esi के रूप में असेंबल होता है। दूसरे शब्दों में:
0x8166 (xor word ptr ds:[eax],...) XOR 0x6799 (डिक्रिप्शन कुंजी) == 0x6eff (jmp esi)
ESI रजिस्टर को हमारे शेलकोड के आरंभ पर सेट करके, हम निष्पादन प्राप्त कर सकते हैं :)
नीचे डिबगिंग का एक उदाहरण है। प्रारंभ में एन्क्रिप्टेड शेलकोड कॉपी किया जाता है, उसके बाद शेलकोड को डिक्रिप्ट और कॉल करने के लिए उपयोग किया गया कोड आता है। यह ध्यान देने योग्य है कि डिक्रिप्शन लूप के तीसरे निष्पादन के बाद, निर्देश xor word ptr ds:[eax],6799 बदलकर jmp esi हो जाता है।

इस तकनीक का उपयोग करने के चरण इस प्रकार हैं:
डिक्रिप्शन कोड को कम पहचानने योग्य बनाने के लिए, शेलकोड को कॉल करने के वैकल्पिक तरीकों का उपयोग करना संभव है। अधिक स्वतंत्रता के लिए हम प्रत्येक पुनरावृत्ति के दौरान एन्क्रिप्ट किए जाने वाले चंक के आकार को बढ़ाने पर विचार कर सकते हैं। मेरे PoC में मैंने 2-बाइट का उपयोग किया क्योंकि jmp esi को दो बाइट की आवश्यकता है, लेकिन हम 4 या 8-बाइट चंक आकार का उपयोग कर सकते हैं, जिससे ऑपरेटर के पास 4 या 8-बाइट चंक में फिट होने वाले अधिक विकल्प हो सकें। शेलकोड को कॉल करने के चुने गए तरीके के अनुसार, एन्क्रिप्शन स्थिरांक भी बदल जाएगा।