gpt4 book ai didi

c - OSX setgid 系统调用 - 哪个 API 是正确的

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:44 25 4
gpt4 key购买 nike

我想使用系统调用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. 的包装器
  3. 在哪里可以找到 int setgid(gid_t); 的实现?
  4. 是否有任何选项可以从 kern_prot.c 调用 setgid 的实现?

更新:

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

谢谢,

最佳答案

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

enter image description here

来自 xnu 来源:

#define SYS_setgid         181

这里 181 = 0xB5

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

code = regs->rax & SYSCALL_NUMBER_MASK;

其中 SYSCALL_NUMBER_MASK 是 ~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)

关于c - OSX setgid 系统调用 - 哪个 API 是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656016/

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