2012-03-06 8 views
6

में फ़ंक्शन पॉइंटर को कास्टिंग करके शेलकोड निष्पादित करें यह ठीक काम करता है।विजुअल सी ++

unsigned char b[50] = "\xda\xd1 ... \x0"; //some shellcode with terminating \x0 
((void(*)())b)(); //cast b to function pointer from void to void, then run it 

लेकिन जब यह विजुअल C++ में डाल दिया है, यह पता थूक यह त्रुटि संदेश:

1>..\test.cpp(132): error C2440: 'type cast' : cannot convert from 'unsigned char [50]' to 'void (__cdecl *)(void)' 
1>   There is no context in which this conversion is possible 

किसी को भी पता है कि यह क्यों इतना है कोड कुछ प्रकार है?

+1

'(* (शून्य (*)()) और बी [0])()' कोशिश करें। –

+0

भले ही आप इसे किसी भी तरह काम करने के लिए प्राप्त करते हैं, यह एक बहुत बुरा विचार है। –

+0

या: 'reinterpret_cast (static_cast (बी))() '। –

उत्तर

10

एक उचित डीबगर आपको बताएगा कि क्या गलत हो रहा है। मैं केवल अनुमान लगा सकता हूं कि आपका कोड एक्सेस उल्लंघन का कारण बन रहा है क्योंकि जिस बफर को आप कूदना चाहते हैं वह निष्पादन योग्य नहीं है।

शायद आप डिफ़ॉल्ट पर हैं- DEP - Vista या 7 जैसी सक्षम प्रणाली, इसलिए आपको यह सुनिश्चित करना होगा कि आपका शेलकोड निष्पादन योग्य है। ऐसा करने के लिए, पहली बार उपयोग VirtualAlloc एक नया, निष्पादन योग्य बफर आवंटित और इसे में अपने shellcode कॉपी करने के लिए, तो यह निष्पादित करें:

void *exec = VirtualAlloc(0, sizeof b, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
memcpy(exec, b, sizeof b); 
((void(*)())exec)(); 

वैसे, आप shellcode (सी शून्य-समाप्त करने के लिए ++ आवश्यकता नहीं है, स्वचालित रूप से आपके लिए स्ट्रिंग अक्षर को समाप्त करें, लेकिन यह आवश्यक नहीं है)। आपको आकार निर्दिष्ट करने की भी आवश्यकता नहीं है:

unsigned char b[] = "\xcc"; 
+0

धन्यवाद - यह ठीक से काम करता है। पता नहीं था कि सामान निष्पादित करने के लिए एक विशेष आवंटन समारोह था। – Arcinde

+1

@ user49164: स्टैक-और ढेर-आधारित बफर ओवरफ्लो का शोषण करने में कठिनाई को बढ़ाने के लिए, डीईपी स्मृति पृष्ठों पर निष्पादन अनुमतियों की आज्ञाकारिता को लागू करता है। यह ढेर या ढेर पर डेटा के तत्काल निष्पादन को रोकता है। 'वर्चुअलअलोक' सामान निष्पादित करने के लिए एक विशेष आवंटन फ़ंक्शन नहीं है, यह सामान्य आवंटन फ़ंक्शन है (जो आवंटित स्मृति की इच्छित पहुंच अनुमतियों के तर्क के रूप में होता है)। –

0

ठेठ एक अलग प्रकार के रूप में डेटा पुनर्व्याख्या करने के लिए जिस तरह से द्विआधारी प्रतिनिधित्व को कॉपी करके है:

void (*fp)(); 
unsigned char buf[50]; 
char const * p = reinterpret_cast<char const *>(&buf); 

std::copy(p, p + sizeof(char const *), reinterpret_cast<char*>(&fp)); 

// now fp contains the same value as &buf 

fp(); // call 

यह aliasing और संरेखण के उल्लंघन की वजह से अपरिभाषित व्यवहार से बचा जाता है।

+0

ओपी कोड के रूप में सामग्री निष्पादित करने के लिए, एक फ़ंक्शन पॉइंटर के रूप में बफर को पॉइंटर को दोबारा परिभाषित करने का प्रयास कर रहा है। आपका संस्करण फ़ंक्शन पॉइंटर को कुछ बफर सामग्री के साथ ओवरराइट करता है - परिणाम निश्चित रूप से मान्य सूचक नहीं है। आपको पॉइंटर को 'buf' में परिभाषित करने की आवश्यकता होगी, फिर उसके मान की प्रतिलिपि बनाएँ। –

+0

पुष्टि की। यह रनटाइम पर दुर्घटनाग्रस्त हो जाता है। – Arcinde

+0

@ user49164: हाँ, माइक सही है। उसके लिए माफ़ करना। फिक्स्ड। –