首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在主线程的堆栈上调用mprotect总是失败

在主线程的堆栈上调用mprotect总是失败
EN

Stack Overflow用户
提问于 2015-11-09 13:44:57
回答 2查看 179关注 0票数 2

我尝试在主线程的堆栈上调用mprotect,但总是失败。每次尝试时,都会产生一个ENOMEM错误。我已经检查了/proc/pid/map,整个堆栈都映射到地址空间中。但是,我可以成功地从主堆栈调用子线程的堆栈上的mprotect。主线程的堆栈必须有一些特殊之处,以防止自身被mprotect更改。但我找不到这方面的任何文件。有谁有主意吗?

代码语言:javascript
复制
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>
#include <pthread.h>
#include <stdio.h>

void * addr;
size_t size;

void * thread(void * tls) {
    sleep(1);
    if (mprotect(addr, size, PROT_NONE) == -1) perror(NULL);
    return NULL;
}

int main(int argc, const char *argv[]) {
    pthread_attr_t attr;
    pthread_getattr_np(pthread_self(), &attr);
    pthread_attr_getstack(&attr, &addr, &size);

    pthread_t th;
    pthread_create(&th, NULL, thread, NULL);
    sleep(2);
    pthread_join(th, NULL);
    return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2015-11-09 15:13:55

您正在尝试保护未映射的页面。如果您查看pthread_attr_getstack的源代码,您会发现没有按需映射的mmap.Stack页面。this might help you

票数 3
EN

Stack Overflow用户

发布于 2015-11-11 01:40:42

我用这个code来保护我的生命。它在你的代码中工作得很好。像这样调用该方法->

代码语言:javascript
复制
39     pthread_attr_getstack(&attr, &addr, &size);
40     __enable_execute_stack(&addr);

编译:gcc your_code.c __enable_execute_stack_code.h -lpthread -fbuilding-libgcc

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33603166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档