当项目中包含汇编文件时,mmap 出现意外的执行权限

2024-10-14 08:40:00
admin
原创
93
摘要:问题描述:我正为此而撞墙。在我的项目中,当我使用mmap映射分配内存时(/proc/self/maps)显示它是一个可读和可执行的区域,尽管我只请求可读内存。在研究了 strace(看起来不错)和其他调试之后,我能够确定似乎可以避免这个奇怪问题的唯一方法:从项目中删除汇编文件并只留下纯 C。(什么?!)这是我...

问题描述:

我正为此而撞墙。

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

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

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

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

例子.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;
}

example.s:是一个空文件!

输出

包含 ASM 的版本

VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0 

不包含 ASM 的版本

VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0 

解决方案 1:

Linux 有一个执行域,称为READ_IMPLIES_EXEC,这会导致所有分配了 的页面PROT_READ也被赋予PROT_EXEC。较旧的 Linux 内核曾经将其用于使用 等效项的可执行文件gcc -z execstack。此程序将显示它是否已为其自身启用:

#include <stdio.h>
#include <sys/personality.h>

int main(void) {
    printf("Read-implies-exec is %s
", personality(0xffffffff) & READ_IMPLIES_EXEC ? "true" : "false");
    return 0;
}

如果您将其与空.s文件一起编译,您将看到它已启用,但如果没有,它将被禁用。它的初始值来自二进制文件中的 ELF 元信息。执行readelf -Wl example。当您在没有空文件的情况下进行编译时,您将看到此行.s

  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10

但是当你用它编译时:

  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RWE 0x10

注意,RWE不要只使用RW。这样做的原因是,除非明确告知链接器不需要,否则链接器会假定您的汇编文件需要 read-implies-exec,并且如果程序的任何部分需要 read-implies-exec,则将为整个程序启用它。GCC 编译的汇编文件会用以下行(如果您使用 进行编译,则会看到此行)告诉它不需要此功能-S

    .section        .note.GNU-stack,"",@progbits

默认部分权限不包括 e ec。请参阅文档x的 ELF 部分以了解“标志”和 @attributes 的含义。.section

(如果您依赖于文件顶部的默认部分,请不要忘记在该指令之后切换到另一个部分,如.text或。).data`.section.s.text`

把该行放入(以及项目中的example.s每个其他文件)。该部分的存在将告诉链接器此目标文件不依赖于可执行堆栈,因此链接器将使用元数据,而不是元数据,然后您的程序将按预期工作。.s`.note.GNU-stackRWRWE`GNU_STACK

类似地,对于 NASM,section具有正确标志的指令指定不可执行堆栈。


5.4 和 5.8 之间的现代 Linux 内核改变了ELF 程序加载器的行为READ_IMPLIES_EXEC。对于 x86-64,什么都不再起作用。最多(通过GNU_STACK添加RWE ld),您将获得可执行的堆栈本身,而不是每个可读页面。(此答案.data涵盖了 5.8 中的最后一个更改,但在此之前肯定还有其他更改,因为该问题显示在x86-64 Linux 5.4上成功执行了代码)

exec-all( READ_IMPLIES_EXEC) 仅发生在旧版 32 位可执行文件中,其中链接器根本没有添加GNU_STACK标头条目。但如此处所示,现代ld总是通过一种设置或另一种设置添加该条目,即使输入.o文件缺少注释。

您仍应使用此.note部分来在正常程序中发出不可执行堆栈的信号。但是,如果您希望在测试 shellcode.data的旧教程中或按照旧教程测试自修改代码,那么在现代内核上,这不是一个选项。

解决方案 2:

作为使用 GNU 特定的节指令变体修改汇编文件的替代方法,您可以将其添加-Wa,--noexecstack到命令行以构建汇编文件。例如,看看我在 musl 中是如何做的configure

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

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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用