2010-03-13 14 views
5

हाय मैं कच्चे मशीन कोड को स्मृति में लोड करने की कोशिश कर रहा हूं और इसे सी प्रोग्राम के भीतर से चला रहा हूं, अभी जब प्रोग्राम चलाने की कोशिश करते समय इसे निष्पादित करता है इसे निष्पादन योग्य बनाने के लिए स्मृति पर 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 `*' 

मुझे इस कोड तक पहुंचने के लिए प्रोग्राम नहीं मिला है, इसलिए मैं यह देखने में असमर्थ हूं कि मेरा असेंबलर कोड क्या कर रहा है या नहीं।

+0

क्या ऑपरेटिंग सिस्टम? –

+0

क्षमा करें, यह x86 लिनक्स विशेष रूप से उबंटू के लिए है। (मुझे लगता है कि उबंटू के ओवर-प्रोटेक्शन के साथ कुछ करने के लिए कुछ हो सकता है) – ChartreuseKitsune

+0

यह किस तरह की विफलता है? क्या आपने इसे जीडीबी के तहत बस चलाने की कोशिश की है और देख रहा है, आगे क्या होता है? –

उत्तर

5

ठीक है, यहाँ जवाब, टिप्पणी :)

स्मृति क्षेत्र प्रणाली पृष्ठ आकार के गठबंधन किया जाना चाहिए में हमारी चर्चा के अनुसार है। posix_memalign() कॉल ऐसे मामले में स्मृति आवंटित करने का एक सही तरीका है :)

+0

इसलिए मुझे लगता है कि पृष्ठ के आकार के गुणकों में यह आवंटित किया जाना चाहिए, और फ़ाइल लंबाई – ChartreuseKitsune

+0

से नहीं, ठीक है, अगर मुझे यह सही लगता है, तो केवल आकार को गठबंधन किया गया है, आकार नहीं। आकार बाइट्स में दिया जाता है (एसीसी।आदमी को) –

+0

ठीक है कि यह mprotect त्रुटि से पहले मिल गया है। का उपयोग करना: membuf = (char *) memalign (pagesize, sz * sizeof (char)); मॉलोक के बजाय। – ChartreuseKitsune

1

अपने 0x90 (noop) बाइट्स के बाद 0xc3 (वापसी निर्देश) जोड़ें। आपका प्रोग्राम क्रैश हो रहा है क्योंकि यह एनओयूपी के अंत से बाहर हो जाता है और या तो अनियमित स्मृति में चला जाता है, जो जानता है कि वहां क्या है, या निष्पादन योग्य पृष्ठ के अंत में। मैं वास्तव में यह नहीं देख सकता कि आप जो फ़ाइल लोड कर रहे हैं उसमें क्या है।

बीटीडब्ल्यू स्ट्रेस इस तरह के कार्यक्रमों के लिए बहुत उपयोगी है। यह आपको बताया होगा कि mprotect में त्रुटि क्या थी।

1

सभी परमिट का उपयोग PROT_EXEC | PROT_READ | PROT_WRIT की भी आवश्यकता नहीं है और थोड़े खतरनाक हैं। आपको आमतौर पर PROT_WRITE की आवश्यकता नहीं है, बस निष्पादित करें और पढ़ें पर्याप्त है।

कुछ सुरक्षित कर्नेल PROT_EXEC को भी अनुमति नहीं देते हैं। PROT_WRIT।

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