gpt4 book ai didi

C - 程序仅在使用 GDB 运行时无法获取文件描述符

转载 作者:IT王子 更新时间:2023-10-29 01:13:36 27 4
gpt4 key购买 nike

我不是专业的 C 程序员。我在使用 GDB 调试程序时遇到问题。 (我试图修复的错误与我在这里询问的问题无关。)我的问题是当我直接从 shell 运行二进制文件时程序运行良好,但当我使用 GDB 运行它时程序崩溃。

这里有一些关于该程序的信息可能有用:它是一款已有 20 多年历史的数据库软件,最初是为 Solaris 编写的(我认为)但后来移植到 Linux,它是 setuid(但不是 root,感谢上帝)。

尝试打开文件进行写入时,程序在 GDB 中崩溃。使用 GDB,我能够确定发生崩溃是因为以下系统调用失败:

fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);

澄清一下:path 是一个锁文件的路径,不应该存在。如果锁定文件存在,则程序甚至在到达此系统调用之前就会干净地关闭。

我不明白为什么这个系统调用会失败,因为 1) 这个程序运行的用户对包含 path 的目录有 rwx 权限(我已经通过检查变量的值验证了这一点存储在 path 中),以及 2)当我不使用 GDB 调试它时,程序成功打开文件进行写入。

我有什么理由不能

最佳答案

关键原来是这个位:

... is setuid (but not to root, thank god).

当您在(任何)调试器(使用任何停止和检查/修改程序工具)下运行程序时,内核会禁用 setuid-ness,即使对于非根 setuid。

如果您仔细考虑一下,这是有道理的。考虑一个保存“高分”文件的游戏,并使用“setuid games”来执行此操作,其中:

fd = open(GAME_SCORE_FILE, open_mode, file_mode);
score_data = read_scores(fd);
/* set breakpoint here or so */
if (check_for_new_high_score(current_score, score_data)) {
printf("congratulations, you've entered the High Scores records!\n");
save_scores(fd, score_data);
}
close(fd);

对“高分”文件的访问受文件权限保护:只有“游戏”用户可以写入。

不过,如果您在调试器下运行游戏,您可以在标记的行设置一个断点,并将 current_score 数据设置为某个超高值,然后恢复程序。

为避免允许调试器破坏 setuid 程序的内部数据,内核在启用调试功能的情况下运行代码时会简单地禁用 setuid-ness。如果你可以 su (或 sudo 或其他)给用户,表明你有权限而不考虑任何调试,然后你可以作为该用户运行 gdb 本身,这样该程序以它“将”setuid 到的用户身份运行。

关于C - 程序仅在使用 GDB 运行时无法获取文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19779201/

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