相关疑难解决方法(0)

当项目中包含程序集文件时,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;
}
Run Code Online (Sandbox Code Playgroud)

example.s:是一个空文件!

产出

附带ASM版本

VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0 
Run Code Online (Sandbox Code Playgroud)

没有ASM随附的版本

VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 …
Run Code Online (Sandbox Code Playgroud)

c linux assembly mmap

94
推荐指数
2
解决办法
2506
查看次数

Linux 可执行文件 .data 部分的默认行为在 5.4 和 5.9 之间发生了变化?

故事

情况1

我不小心在该.data部分中编写了我的汇编代码。我编译并执行了它。该程序在Linux下正常运行5.4.0-53-generic,即使我没有指定就像一面旗帜execstack

案例2:

之后,我在 Linux 下执行了该程序5.9.0-050900rc5-generic。该程序得到了SIGSEGV。我通过阅读检查了虚拟内存权限/proc/$pid/maps。事实证明,该部分不可执行。

我认为 Linux 上有一个配置可以管理该权限。但我不知道在哪里可以找到。

代码

[Linux 5.4.0-53-通用]

运行(正常)

ammarfaizi2@integral:/tmp$ uname -r
5.4.0-53-generic
ammarfaizi2@integral:/tmp$ cat test.asm
[section .data]
global _start
_start:
  mov eax, 60
  xor edi, edi
  syscall
ammarfaizi2@integral:/tmp$ nasm --version
NASM version 2.14.02
ammarfaizi2@integral:/tmp$ nasm -felf64 test.asm -o test.o
ammarfaizi2@integral:/tmp$ ld test.o -o test
ammarfaizi2@integral:/tmp$ ./test
ammarfaizi2@integral:/tmp$ echo $?
0
ammarfaizi2@integral:/tmp$ md5sum test
7ffff5fd44e6ff0a278e881732fba525  test
ammarfaizi2@integral:/tmp$ 
Run Code Online (Sandbox Code Playgroud)

检查权限(00400000-00402000 rwxp),所以它是可执行的。

## Debug
gef?  shell …
Run Code Online (Sandbox Code Playgroud)

linux assembly x86-64 nasm elf

9
推荐指数
2
解决办法
411
查看次数

标签 统计

assembly ×2

linux ×2

c ×1

elf ×1

mmap ×1

nasm ×1

x86-64 ×1