2016-06-06 1 views
2

Je voudrais utiliser l'appel système setgid, pour changer l'ID du groupe du processus en cours. Essayer de rechercher cette fonction, la seule mise en œuvre que j'ai trouvé est kern_prot.c:OSX appel système setgid - quelle API est la bonne

/* 
* 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) 
{ 
... 
.. 
. 
} 

Notez que selon /usr/unistd.h, l'API est complètement différent (int setgid(gid_t);).

  1. -t int setgid(gid_t); est une enveloppe de int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)
  2. Où puis-je trouver la mise en œuvre de int setgid(gid_t);?
  3. Y at-il une option pour appeler l'implémentation de setgid de kern_prot.c?

MISE À JOUR:

Après le suivi mon programme avec dtruss pour observer les appels système, il semble que l'appel setgid(gid_t) déclencheur l'appel système avec 3 paramètres setgid(0x2, 0x7F9AA3803200, 0x1000) qui correspond à la mise en œuvre kern_prot.c. La question est, où puis-je trouver le code source d'emballage, et quelle bibliothèque fait, il appartient à (glibc peut-être?)

grâce,

+0

Vous êtes très probablement raison de dire que l'API setgid exposée à l'espace utilisateur est en fait une enveloppe de la glibc autour du syscall setgid . – mauzel

+0

@mauzel, merci pour le commentaire. la seule chose qui me dérange toujours est que si je '#include #include #include ' et qu'exécuter le syscall suivant que cela semble fonctionner et l'API est avec le seul paramètre ('syscall (SYS_setgid, gid); '). Je n'ai toujours pas cette contradiction. – Zohar81

+0

donc je ne sais rien à propos de Mac OS X/BSD, mais êtes-vous sûr que ça ne l'appelle pas? http://lxr.free-electrons.com/source/kernel/sys.c?v=3.10#L646 – mauzel

Répondre

2

Qu'est-ce que vous cherchez n'est pas opensourced. Mais si vous ouvrez /usr/lib/system/libsystem_kernel.dylib dans l'IDA:

enter image description here

à partir de sources XNU:

#define SYS_setgid   181 

ici 181 = 0xB5

Si vous cochez unix_syscall64 Fonction à l'intérieur de bsd/dev/i386/systemcalls.c (à partir des sources du noyau xnu):

code = regs->rax & SYSCALL_NUMBER_MASK;

SYSCALL_NUMBER_MASK is ~0xFF000000 = 0xFFFFFF (le code est la valeur 32 bits):

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

si 0x20000B5 & 0xFF000000 = 0xB5 (SYS_setgid)