【问题标题】:Why does strace following a different execution flow?为什么 strace 遵循不同的执行流程?
【发布时间】:2012-05-19 18:43:16
【问题描述】:

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

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](使用另一个终端)是文件名,然后为同一文件创建符号链接。当我按照文章中所述执行时,我正在写入链接指向的文件。

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

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

【问题讨论】:

  • 您是否对可执行文件执行了某种 suid/sgid 位?
  • @ChristopherCreutzig:程序使用stat (filename) 获取权限。但在可执行文件中我没有篡改。
  • 我的意思是:程序在编译后是否作为 suid 二进制文件运行? IIRC,strace 会忽略这一点。
  • 经过一番谷歌搜索后,我得到了chmod +s a.out 表示以 suid 二进制文件运行。是的,我正在这样做。那么这是否意味着 strace 就像我没有执行该命令一样工作?
  • 我相信是的。只需使用 shell 作为它将运行的用户并在 strace 下启动它。 (我将把它放在下面的答案中,只是为了让大家看到问题已在概述列表中得到回答。)

标签: c system-calls ptrace strace


【解决方案1】:

如上所述,二进制文件以 suid 标志 (chmod u+s a.out) 启动。由于strace 需要监视进程,如果它以其他用户身份运行则不能这样做,它会默默地忽略 s-bits。

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

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

【讨论】:

  • @chritopher Creutzig:非常感谢这么快的回复。我没有完全阅读 strace 的手册页。对不起:)
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多