हाय मैं कच्चे मशीन कोड को स्मृति में लोड करने की कोशिश कर रहा हूं और इसे सी प्रोग्राम के भीतर से चला रहा हूं, अभी जब प्रोग्राम चलाने की कोशिश करते समय इसे निष्पादित करता है इसे निष्पादन योग्य बनाने के लिए स्मृति पर mprotect। मुझे पूरी तरह से यकीन नहीं है कि अगर स्मृति सही हो जाती है तो यह निष्पादित हो जाएगी। मैं वर्तमान में उबंटू लिनक्स 86 (? हो सकता है कि समस्या उबंटू खत्म हो चुका है-संरक्षण है) पर इस चला रहा हूँसी में से मेमोरी और निष्पादन में फ़ाइल से मशीन कोड लोड हो रहा है -
क्या मैं वर्तमान में है निम्नलिखित है:
#include <memory.h>
#include <sys/mman.h>
#include <stdio.h>
int main (int argc, char **argv)
{
FILE *fp;
int sz = 0;
char *membuf;
int output = 0;
fp = fopen(argv[1],"rb");
if(fp == NULL)
{
printf("Failed to open file, aborting!\n");
exit(1);
}
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
fseek(fp, 0L, SEEK_SET);
membuf = (char *)malloc(sz*sizeof(char));
if(membuf == NULL)
{
printf("Failed to allocate memory, aborting!\n");
exit(1);
}
memset(membuf, 0x90, sz*sizeof(char));
if(mprotect(membuf, sz*sizeof(char), PROT_EXEC | PROT_READ | PROT_WRITE) == -1)
{
perror("mprotect");
printf("mprotect failed!!! aborting!\n");
exit(1);
}
if(!(fread(membuf, sz*sizeof(char), 1, fp)))
{
perror("fread");
printf("Read failed, aborting!\n");
exit(1);
}
__asm__
(
"call %%eax;"
: "=a" (output)
: "a" (membuf)
);
printf("Output = %x\n", output);
return 0;
}
मैं संकलक चेतावनी मिलती है:
/tmp/ccVnhHak.s: Assembler messages:
/tmp/ccVnhHak.s:107: Warning: indirect call without `*'
मुझे इस कोड तक पहुंचने के लिए प्रोग्राम नहीं मिला है, इसलिए मैं यह देखने में असमर्थ हूं कि मेरा असेंबलर कोड क्या कर रहा है या नहीं।
क्या ऑपरेटिंग सिस्टम? –
क्षमा करें, यह x86 लिनक्स विशेष रूप से उबंटू के लिए है। (मुझे लगता है कि उबंटू के ओवर-प्रोटेक्शन के साथ कुछ करने के लिए कुछ हो सकता है) – ChartreuseKitsune
यह किस तरह की विफलता है? क्या आपने इसे जीडीबी के तहत बस चलाने की कोशिश की है और देख रहा है, आगे क्या होता है? –