开发者社区> 问答> 正文

当项目中包含程序集文件时,mmap的意外执行权限

我正在用这个把我的头撞到墙上。

在我的项目中,使用mmap映射(/proc/self/maps)分配内存时,尽管我只请求了可读内存,但它仍是一个可读且可执行的区域。

在研究了strace(看起来不错)和其他调试之后,我能够确定似乎唯一可以避免这个奇怪问题的东西:从项目中删除程序集文件,仅保留纯C。(什么?!)

所以这是我一个奇怪的例子,我正在使用Ubunbtu 19.04和默认的gcc。

如果使用ASM文件(为空)编译目标可执行文件,则将mmap返回一个可读和可执行区域,如果不进行编译则其行为正确。请参阅/proc/self/maps示例中已嵌入的输出。

example.c

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>

int main()
{
    void* p;
    p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0);

    {
        FILE *f;
        char line[512], s_search[17];
        snprintf(s_search,16,"%lx",(long)p);
        f = fopen("/proc/self/maps","r");
        while (fgets(line,512,f))
        {
            if (strstr(line,s_search)) fputs(line,stderr);
        }

        fclose(f);
    }

    return 0;
}

展开
收起
祖安文状元 2020-01-07 14:01:25 386 0
1 条回答
写回答
取消 提交回答
  • 作为使用特定于GNU的section指令变体修改程序集文件的替代方法,您可以添加-Wa,--noexecstack到命令行中以构建程序集文件。例如,看看我是如何在musl的configure:

    https://git.musl-libc.org/cgit/musl/commit/configure?id=adefe830dd376be386df5650a09c313c483adf1a

    我相信至少有某些版本的带有集成汇编程序的clang可能要求将其作为--noexecstack(不带-Wa)进行传递,因此您的configure脚本可能应该同时检查两者并查看哪个被接受。

    您也可以-Wl,-z,noexecstack在链接时间(中使用LDFLAGS)获得相同的结果。这样做的缺点是,如果您的项目生成.a供其他软件使用的静态()库文件,则无济于事,因为当其他程序使用链接时选项时,您将无法对其进行控制。

    2020-01-07 14:01:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
15分钟打造你自己的小程序 立即下载
小程序 大世界 立即下载
《15分钟打造你自己的小程序》 立即下载