2

我想使用系统调用 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?)

谢谢 ,

4

1 回答 1

4

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

在此处输入图像描述

来自 xnu 来源:

#define SYS_setgid         181

这里 181 = 0xB5

如果您检查unix_syscall64bsd/dev/i386/systemcalls.c 中的函数(来自 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 & 0xFF000000 = 0xB5(SYS_setgid)

于 2016-11-29T17:47:12.167 回答