2013-10-28 3 views
14

यह संभव गतिशील स्मृति आवंटन, यह करने के लिए कुछ कोडांतरक opcodes लिख कर एक गतिशील समारोह बनाने के लिए है (जैसे 0x90 एनओपी आरईटी के लिए 0xC2), एक समारोह सूचक जो कि गतिशील स्मृति को इंगित करता है और जैसे कि यह अमल बनाने एक सी कार्यक्रम के भीतर से एक नियमित समारोह?सी फ़ंक्शन पॉइंटर: क्या मैं मेमोरी असेंबलर कोड को ढेर करने के लिए कूद सकता हूं?

लक्ष्य नियमित x86 लिनक्स सिस्टम होना चाहिए।

+0

इसी तरह की, लेकिन एक ही बात नहीं - 'int main = 0xc290;' संकलित और सफलतापूर्वक चलाता है। – ugoren

+0

@ugoren केवल कुछ परिस्थितियों में। – glglgl

+0

@glglgl, प्रश्न में वर्णित परिस्थितियों में। – ugoren

उत्तर

3

यह मेमोरी ढेर मेमोरी नहीं है (नीचे नोट देखें)। इसके अलावा, मुझे लगता है कि आप ढेर स्मृति की निष्पादन अनुमति नहीं बदल सकते हैं।

लिनक्स पर, आप उपयोग कर सकते हैं निम्नलिखित:

#include <sys/mman.h> 
size_t size = 0x1000; // 1 page 
// this will be mapped somewhere between /lib/x86_64-linux-gnu/ld-2.15.so 
// and stack (see note and memory map below) 
void *code = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS, -1, 0); 
// use `code` to write your instructions 
// then store location at which you want to jump to in `fp` 
void *fp = ...; 
mprotect(code, size, PROT_READ | PROT_EXEC); 
// use some inline assembly to jump to fp 

नोट: लिनक्स पर, उपयोगकर्ता द्वारा मैप स्मृति अलग क्षेत्र (400000000000 से और ऊपर की तरह कुछ में 86 लिनक्स पर ढेर स्थित है, और शायद x12 एक पर 7f0000000000)। हीप प्रोग्राम के ईएलएफ सेगमेंट और क्षेत्र से पहले mmap के लिए उपलब्ध है। हीप को सीधे brk सिस्टम कॉल का उपयोग करके आवंटित किया जा सकता है (अब तक malloc द्वारा अधिलेखित)। इस उदाहरण (मेरी उबंटू 12.10 x64 पर मिल गया) देखें:

➜ ~ ps 
    PID TTY   TIME CMD 
9429 pts/3 00:00:07 zsh 
20069 pts/3 00:00:00 git-credential- 
22626 pts/3 00:00:00 ps 
➜ ~ cat /proc/9429/maps 
00400000-004a2000 r-xp 00000000 08:01 6291468       /bin/zsh5 
006a1000-006a2000 r--p 000a1000 08:01 6291468       /bin/zsh5 
006a2000-006a8000 rw-p 000a2000 08:01 6291468       /bin/zsh5 
006a8000-006bc000 rw-p 00000000 00:00 0 
01a51000-01fd8000 rw-p 00000000 00:00 0         [heap] 
... 
7f6529d61000-7f6529d91000 rw-p 00000000 00:00 0 
... 
7f652d0d3000-7f652d0d5000 rw-p 00023000 08:01 44833271     /lib/x86_64-linux-gnu/ld-2.15.so 
7fffd7c7f000-7fffd7cae000 rw-p 00000000 00:00 0       [stack] 
7fffd7dff000-7fffd7e00000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 

आप देख सकते हैं, heap निष्पादन योग्य नहीं है (और ठीक ही तो है), तो आप malloc उपयोग नहीं कर सकते निष्पादन योग्य स्मृति पाने के लिए।

2

कई प्रणालियों के पास वर्चुअल मेमोरी पेजों पर लंबे समय तक झंडे होते हैं जो बताते हैं कि क्या वे निष्पादन योग्य कोड हो सकते हैं या नहीं। ढेर की आवंटित स्मृति में यह "निष्पादन योग्य" ध्वज सेट नहीं होगा। तो नहीं, आप सीधे ऐसा नहीं कर सकते हैं।

यदि आप ऐसा करना चाहते हैं तो आपको ओएस विशिष्ट कार्यों का उपयोग करना होगा, और प्रोग्राम को "व्यवस्थापक" या "रूट" के रूप में चलाने में सक्षम होना पड़ सकता है, हालांकि यह आवश्यक नहीं लगता है।

+2

मुझे नहीं लगता कि आपको रूट होने की आवश्यकता है, निष्पादन योग्य स्मृति आवंटित करना ऐसी प्रणाली-खतरनाक चीज़ नहीं है, और इसका उपयोग है (लगभग कोई भी मौजूदा ब्राउज़र जावास्क्रिप्ट इंजन में करता है)। –

+0

अधिक से अधिक सर्वव्यापी .Net ढांचे का उल्लेख नहीं है। – Blindy

17

सामान्य हां में, लेकिन आपको ऐसा करने के लिए सिस्टम-विशिष्ट चीजों में जाना होगा। मुझे लगता है कि यह आश्चर्यजनक नहीं है, क्योंकि तथ्य यह है कि आप बाइनरी असेंबली निर्देशों का उपयोग करने जा रहे हैं, यह बहुत स्पष्ट है।

आपको यह पता होना चाहिए कि आप यह नहीं मान सकते कि आधुनिक ऑपरेटिंग सिस्टम पर ढेर मेमोरी निष्पादन योग्य है, इसलिए आपको इसे बनाने के लिए कुछ हुप्स से कूदने की आवश्यकता हो सकती है। आप केवल malloc() पर कॉल नहीं कर सकते हैं और लौटाए गए पॉइंटर पॉइंट को स्मृति में मान सकते हैं जहां आप कोड निष्पादित कर सकते हैं।

लिनक्स में, आप कर्नेल से कुछ मेमोरी मैप करने के लिए पूछने के लिए mmap() का उपयोग कर सकते हैं और कॉल में PROT_EXEC ध्वज निर्दिष्ट करके आप इसे स्मृति निष्पादन योग्य बनाने के लिए भी कह सकते हैं।

+1

विंडोज के तहत आप [वर्चुअलप्रोटेक्ट] (http://msdn.microsoft.com/en-us/library/aa366898%28v=vs.85%29 का उपयोग कर सकते हैं।एएसपीएक्स) – Asaf

+1

मैं कहूंगा कि आप यह भी मान नहीं सकते कि ढेर मेमोरी निष्पादन योग्य है। लेकिन आपको ढेर होने के लिए इस स्मृति की आवश्यकता नहीं है; मेरा जवाब देखें –

संबंधित मुद्दे

 संबंधित मुद्दे