Pourquoi l’UID effectif n’est-il toujours pas 0?

J’ai donc reçu ce code ci-dessous. Cependant quand je suis les commandes:

sudo chown root:root a.out sudo chmod u+s a.out 

Il ne sera toujours pas exécuté avec uid effectif à 0.

Ceci est le code:

 #define _POSIX_C_SOURCE 200112L // Needed with glibc (eg, linux). #include  #include  #include  void report (uid_t real) { printf ("Real UID: %d Effective UID: %d\n", real, geteuid()); } int main (void) { uid_t real = getuid(); report(real); seteuid(real); report(real); return 0; } 

La sortie est la suivante:

 Real UID: 1000 Effective UID: 1000 Real UID: 1000 Effective UID: 1000 

Où je supposais que ça aurait dû être:

 Real UID: 1000 Effective UID: 0 Real UID: 1000 Effective UID: 1000 

La fonction getuid renvoie uniquement l’ID utilisateur réel. Le véritable identifiant d’utilisateur du processus utilisateur est toujours 1000. Le 1000 est stocké dans la variable réelle.

Ainsi, lors de l’appel de la fonction seteuid, vous définissez à nouveau le 1000 comme identifiant utilisateur effectif. Mais vous devez en fait définir le 0 à cet endroit. Donc, seul l’ID utilisateur effectif n’a pas changé.

Essayez le ci-dessous, il fonctionnera bien.

 #define _POSIX_C_SOURCE 200112L // Needed with glibc (eg, linux). #include  #include  #include  void report (uid_t real) { printf ("Real UID: %d Effective UID: %d\n", real, geteuid()); } int main (void) { uid_t real = getuid(); report(real); seteuid(0); report(real); return 0; } 

Apparemment, @MarkPlotnick a dit.

cd dans le répertoire où cet a.out est. Exécutez df. pour obtenir le sharepoint assembly. Run mount | grep themountpoint et voir ce que sont le type de système de fichiers et les options de assembly.

S’il y a quelque chose qui dit nosuid vous devez remonter cette partie du système de fichiers sans l’indicateur nosuid.

Ce site Web donne ici une bonne explication sur la façon de procéder.