यह मेमोरी ढेर मेमोरी नहीं है (नीचे नोट देखें)। इसके अलावा, मुझे लगता है कि आप ढेर स्मृति की निष्पादन अनुमति नहीं बदल सकते हैं।
लिनक्स पर, आप उपयोग कर सकते हैं निम्नलिखित:
#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
उपयोग नहीं कर सकते निष्पादन योग्य स्मृति पाने के लिए।
स्रोत
2013-10-28 13:32:25
इसी तरह की, लेकिन एक ही बात नहीं - 'int main = 0xc290;' संकलित और सफलतापूर्वक चलाता है। – ugoren
@ugoren केवल कुछ परिस्थितियों में। – glglgl
@glglgl, प्रश्न में वर्णित परिस्थितियों में। – ugoren