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システム コールを監視するためにプログラムを監視した後、kern_prot.c の実装と一致するsetgid(gid_t)3 つのパラメータでシステム コールを 呼び出すようです。setgid(0x2, 0x7F9AA3803200, 0x1000)問題は、ラッパーのソース コードをどこで見つけることができるか、それがどのライブラリに属しているか (おそらく 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 に答える