gpt4 book ai didi

c - 为什么 strace 遵循不同的执行流程?

转载 作者:行者123 更新时间:2023-11-30 14:25:12 25 4
gpt4 key购买 nike

我指的是以下article学习符号链接(symbolic link)攻击:

struct stat st;
FILE * fp;
if (argc != 3) {
fprintf (stderr, "usage : %s file message\n", argv [0]);
exit(EXIT_FAILURE);
}

if (stat (argv [1], & st) < 0) {
fprintf (stderr, "can't find %s\n", argv [1]);
exit(EXIT_FAILURE);
}

if (st . st_uid != getuid ()) {
fprintf (stderr, "not the owner of %s \n", argv [1]);
exit(EXIT_FAILURE);
}

if (! S_ISREG (st . st_mode)) {
fprintf (stderr, "%s is not a normal file\n", argv[1]);
exit(EXIT_FAILURE);
}

sleep (25);

if ((fp = fopen (argv [1], "w")) == NULL) {
fprintf (stderr, "Can't open\n");
exit(EXIT_FAILURE);
}

fprintf (fp, "%s\n", argv [2]);
fclose (fp);
fprintf (stderr, "Write Ok\n");
exit(EXIT_SUCCESS);

现在,当程序休眠时,我rm arg[1](使用另一个终端)(使用另一个终端)(即文件名),然后为同一文件创建符号链接(symbolic link)。当我按照文章中所述执行时,我正在写入链接指向的文件。

然后我使用 strace 传递了相同的参数,它给了我“无法打开”,这意味着我无权访问作为 arg[1] 传递的文件。但当我正常执行时情况并非如此,strace 是如何检测到这一点的?任何帮助都非常有值(value)。

我正在使用 ptrace 编写自己的应用程序来检测此类攻击。我尝试使用 inode 号来检测这一点,但我的应用程序仍然引用我传递的文件的 inode 号。

最佳答案

如上所述,二进制文件以 suid 标志启动 (chmod u+s a.out)。由于 strace 需要监视进程,并且如果它以其他用户身份运行则无法执行此操作,因此它会默默地忽略 s 位。

解决方案:在运行程序的 shell 窗口中,使用无需 strace 即可使用的登录名/用户 ID - 假设您刚刚执行了 chmod u+s a.out 操作用户,可以安全地假设您可以使用该帐户登录。

为了完整起见:要更改单个 shell 窗口的用户 ID,只需使用 su - otherlogin,将 otherlogin 替换为登录名。 (su =“切换用户”)

关于c - 为什么 strace 遵循不同的执行流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10546782/

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