【问题标题】:OSX setgid system call - which API is the correct oneOSX setgid 系统调用 - 哪个 API 是正确的
【发布时间】:2016-12-01 00:42:14
【问题描述】:

我想使用系统调用setgid,来改变当前进程的组ID。试图查找这个函数,我发现的唯一实现是在 kern_prot.c 中:

/*
 * setgid
 *
 * Description: Set group ID system call
 *
 * Parameters:  uap->gid            gid to set
 ...
 ..
 .
 */

 int
 setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)
 {
 ...
 ..
 .
 }

请注意,根据 /usr/unistd.h,API 完全不同(int setgid(gid_t);)。

  1. int setgid(gid_t);int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval) 的包装器吗
  2. 在哪里可以找到int setgid(gid_t);的实现?
  3. 是否有任何选项可以从 kern_prot.c 调用 setgid 的实现?

更新:

dtruss监控我的程序观察系统调用后,似乎调用setgid(gid_t)触发了带3个参数的系统调用 setgid(0x2, 0x7F9AA3803200, 0x1000) 与 kern_prot.c 中的实现相匹配。问题是,我在哪里可以找到包装源代码,它属于哪个库(可能是 glibc?)

谢谢,

【问题讨论】:

  • 您很可能是正确的,因为暴露给用户空间的 setgid API 实际上是围绕 setgid 系统调用的 glibc 包装器。
  • @mauzel,感谢您的评论。唯一仍然困扰我的是,如果我 #include <unistd.h> #include <sys/syscall.h> #include <errno.h> 并运行以下系统调用,那么它似乎可以工作,并且 api 使用单个参数(syscall(SYS_setgid, gid);)。我还是不明白这个矛盾。
  • 所以我对 mac OS X/BSD 一无所知,但你确定它没有调用它吗? lxr.free-electrons.com/source/kernel/sys.c?v=3.10#L646

标签: c macos bsd mach


【解决方案1】:

你要找的不是开源的。但是如果你在 IDA 中打开 /usr/lib/system/libsystem_kernel.dylib:

来自 xnu 来源:

#define SYS_setgid         181

这里 181 = 0xB5

如果您检查 bsd/dev/i386/systemcalls.c 中的 unix_syscall64 函数(来自 xnu 内核源代码):

code = regs->rax & SYSCALL_NUMBER_MASK;

其中SYSCALL_NUMBER_MASK is ~0xFF000000 = 0xFFFFFF(代码为32位值):

#define SYSCALL_CLASS_SHIFT 24
#define SYSCALL_CLASS_MASK  (0xFF << SYSCALL_CLASS_SHIFT)
#define SYSCALL_NUMBER_MASK (~SYSCALL_CLASS_MASK)

所以0x20000B5 &amp; 0xFF000000 = 0xB5 (SYS_setgid)

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 2019-04-06
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多