2016-04-15 29 views
5

Làm cách nào để di chuyển ngăn xếp của tôi đến địa chỉ ảo cụ thể? Ví dụ tôi muốn cho ngăn xếp của tôi được 40960 lớn, và bắt đầu trong địa chỉ 0x355480. Tôi cố gắng chơi với setcontext, nhưng tôi muốn biết liệu có một cách 'tiêu chuẩn' để làm điều đó:Di chuyển chồng đến vị trí cụ thể

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

Bạn có thể thực hiện một chức năng tức là switch_stack trong lắp ráp và gán esp đăng ký với giá trị quy định của bạn. –

+0

Bạn không thể thực sự di chuyển một ngăn xếp hiện tại một cách ngẫu nhiên; có thể có các con trỏ tuyệt đối để ngăn các biến ở khắp mọi nơi. –

+0

nhưng tôi có thể làm điều đó vào đầu chương trình, khi không có gì quan trọng. – JKS

Trả lời

-2

Mã dưới đây đặt con trỏ ngăn xếp xung quanh mmap chúng tôi đã làm trước và cho phép chúng ta làm việc trên nó trong main2 chức năng:

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

Để đây là câu trả lời hợp lệ, nó phải giải thích tại sao/tại sao nó trả lời câu hỏi. Ngoài ra, từ việc đọc trang người đàn ông cho 'setcontext (3)', bạn có thể cần một rào cản trình biên dịch để đảm bảo rằng cửa hàng 'flag' thực sự xảy ra trước cuộc gọi đến' setcontext'. Mặc dù có lẽ không phải nếu nó là một toàn cầu, chứ không phải là tĩnh. –

Các vấn đề liên quan