2016-04-15 9 views
5

मेरे स्टैक को विशिष्ट आभासी पते पर कैसे स्थानांतरित करें? उदाहरण के लिए, मैं अपने ढेर के लिए 40 9 60 बड़ा होना चाहता हूं, और पते 0x355480 में शुरू करना चाहता हूं। मैं setcontext के साथ खेल की कोशिश की, लेकिन मुझे पता है कि एक 'मानक' तरीका है कि ऐसा करने के लिए है कि क्या वहाँ चाहते हैं: नीचेविशिष्ट स्थान पर स्टैक को स्थानांतरित करना

ucontext_t cont; 
bool flag = false; 
getcontext (&cont); 
if(!flag){ 
    void* a = mmap((void*)0x34B000, 81920, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 
    cont.uc_mcontext.gregs[REG_ESP] = 0x355000; 
    flag = true; 
    setcontext(&cont); 
} 
+1

आप असेंबली में switch_stack फ़ंक्शन को कार्यान्वित कर सकते हैं और अपने निर्दिष्ट मान के साथ रजिस्टर esp असाइन कर सकते हैं। –

+0

आप वास्तव में यादृच्छिक रूप से मौजूदा स्टैक को स्थानांतरित नहीं कर सकते हैं; हर जगह चर ढेर करने के लिए पूर्ण पॉइंटर्स हो सकते हैं। –

+0

लेकिन मैं इसे प्रोग्राम की शुरुआत में कर सकता हूं, जब कुछ भी महत्वपूर्ण नहीं है। – JKS

उत्तर

-2

कोड mmap हम पहले किया था के आसपास ढेर सूचक सेट करता है और हम पर काम करने के लिए अनुमति देता है यह मुख्य 2 फ़ंक्शन में:

bool flag = false; 
int argc2; 
char ** argv2; 
int main2(){ 
    ... 
} 
int main(int argc, char ** argv){ 
    argc2 = argc; 
    argv2 = argv; 
    ucontext_t cont; 
    getcontext (&cont); 
    if(!flag){ 
     void* a = mmap((void*)0x34B000, 81920, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 
     if(a == MAP_FAILED){ 
     printf("mmapfail"); 
     return 1; 
     } 
     cont.uc_mcontext.gregs[REG_ESP] = 0x355000; 
     flag = true; 
     setcontext(&cont); 
    } else{ 
     exit(main2()); 
    } 
} 
+0

इसके लिए एक वैध उत्तर होने के लिए, यह समझाना होगा कि यह प्रश्न का उत्तर कैसे देता है। साथ ही, 'setcontext (3)' के लिए मैन पेज को पढ़ने से, आपको यह सुनिश्चित करने के लिए एक कंपाइलर बाधा की आवश्यकता हो सकती है कि 'setcontext' पर कॉल से पहले' फ्लैग 'स्टोर वास्तव में होता है। यद्यपि शायद यह स्थिर नहीं है, बल्कि यह स्थिर है। –

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