OSX setgid 系统调用 - API 是正确的
OSX setgid system call - which API is the correct one
我想使用系统调用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);
).
- 是否
int setgid(gid_t);
是 int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)
的包装
- 在哪里可以找到
int setgid(gid_t);
的实现?
- 是否有任何选项可以从 kern_prot.c 调用 setgid 的实现?
更新:
用dtruss
监控我的程序观察系统调用后,好像是调用setgid(gid_t)
触发了带3个参数的系统调用
setgid(0x2, 0x7F9AA3803200, 0x1000)
与 kern_prot.c 中的实现匹配。问题是,我在哪里可以找到包装器源代码,它属于哪个库(也许是 glibc?)
谢谢,
你要找的不是开源的。但是如果你在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 & 0xFF000000 = 0xB5
(SYS_setgid)
我想使用系统调用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);
).
- 是否
int setgid(gid_t);
是int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)
的包装
- 在哪里可以找到
int setgid(gid_t);
的实现? - 是否有任何选项可以从 kern_prot.c 调用 setgid 的实现?
更新:
用dtruss
监控我的程序观察系统调用后,好像是调用setgid(gid_t)
触发了带3个参数的系统调用
setgid(0x2, 0x7F9AA3803200, 0x1000)
与 kern_prot.c 中的实现匹配。问题是,我在哪里可以找到包装器源代码,它属于哪个库(也许是 glibc?)
谢谢,
你要找的不是开源的。但是如果你在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 & 0xFF000000 = 0xB5
(SYS_setgid)