【问题标题】:troubleshoot wrong file permissions解决错误的文件权限
【发布时间】:2017-05-21 13:50:01
【问题描述】:

我有一个创建日志文件的进程,文件权限为 644。但是,当我运行使用 LD_PRELOAD 加载特定共享对象库的进程时,文件权限设置为 2101(特别是设置了 setgid 权限)。我没有创建进程的程序的源代码,但我有 .so 文件的源代码。我确定文件权限是加载 .so 文件的结果,因为当我为创建文件的程序(我编写的)加载 .so 文件时,文件权限设置了 setuid/setgid 位.我尝试将 gdb 用于我编写的程序,但我无法单步执行代码。当我使用 gdb 加载 .so 文件启动程序时,我刚刚收到分段错误错误。我应该如何解决这个问题?我没有看到 .so 文件的源代码中设置了任何文件权限。我写的程序很简单,大概是这个样子-

#include <stdio.h>

int main(){
    printf(" This is my program");
    system("touch /tmp/myfile.txt");

    return(0);
} 

【问题讨论】:

    标签: gdb shared-libraries file-permissions


    【解决方案1】:

    我没有看到 .so 文件的源代码中设置了任何文件权限。

    您的.so 是否插入open

    创建具有“随机”权限的文件的一种方法是(错误地)插入open,如下所示:

    int open(const char *fname, int flags)
    {
        ... do whatever
        return real_open(fname, flags);  // problem: omits 3rd argument to open
                                         // and passes "garbage" permissions when
                                         // O_CREATE is in flags.
    }
    

    当我使用 gdb 加载的 .so 文件启动程序时,我刚刚收到分段错误错误。

    当 GDB 运行您的程序时,它会调用 $SHELL(以处理任何输入/输出重定向)。您的 shell 可能也不喜欢错误地插入其 open

    【讨论】:

    • 再澄清一点,进行插入的正确方法是编写一个包装函数?
    • @user4002112 我不确定你在问什么。如果你写一个插入器,你需要正确地写。对于open,它需要 3 个参数,而不是 2 个。
    • 你是对的,我之前没有写过插入器,但我找到了解决方案,我所需要的只是在处理程序的定义中为权限添加一个额外的参数。
    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2016-04-06
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多