gpt4 book ai didi

linux - 为什么linux上一个看不懂的ELF可以运行?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:48 25 4
gpt4 key购买 nike

我理解如果脚本不可读(即使它是可执行的)则无法运行,因为解释器需要读取它。

但是为什么在linux上一个不可读的binary可以运行(我用gcc把我的代码编译成./my_exe并设置为0100权限)?执行二进制文件总是需要一些阅读,对吧?然后我读了这个 Can a file that is executable be read? , 但我仍然有一些疑问。

execve(2)告诉我内核将调用 /lib/ld-linux.so.2 来运行程序(我用 readelf 检查,它确实有 INTERP 段,即 /lib64/ld -linux-x86-64.so.2),所以我认为 /lib64/ld-linux-x86-64.so.2 是用户空间 ELF 加载器(它做动态链接和 mmap ELF 到内存中)。由于我无法读取 ELF,我想我应该无法运行它,因为运行它需要读取其 GOT 以进行动态链接。事实证明我确实不能像/lib64/ld-linux-x86-64.so.2 my_exe那样运行它。我只是收到它无法加载共享对象的消息。但是当我像 ./my_exe 这样直接从 bash 运行它时,它运行成功。

我的问题是:既然执行ELF涉及到ld-linux-x86-64.so.2,为什么我编译的0100权限的程序可以直接运行? ld-linux-x86-64.so.2 应该是读不到的,所以应该读不到GOT,做动态链接。那为什么我直接运行就成功了呢?

最佳答案

ld.so 是二进制地址空间的一部分,它由内核加载,目的是加载其他(动态)库。当它已经被内核加载到内存中时,为什么它应该从磁盘读取你的二进制文件?所以事实证明 ld.so 没有读取任何内容,因此没有通过安全检查。

Did you mean, when kernel do execve it will do mmap for both PT_INTERP and the ELF itself with proper permission (like make the GOT readable-ly mmaped)

有的,可以自己查here

 static int load_elf_binary(struct linux_binprm *bprm)
...
if (elf_interpreter) {
unsigned long interp_map_addr = 0;

elf_entry = load_elf_interp(&loc->interp_elf_ex,
interpreter,
&interp_map_addr,
load_bias, interp_elf_phdata);

关于linux - 为什么linux上一个看不懂的ELF可以运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52251097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com