1 /* 2 * usage: 3 * $ gcc -W -Wall at.c 4 * $ su 5 * # chown root a.out; chmod u+s a.out 6 * # exit 7 * $ ./a.out 8 */ 9 #include <err.h> 10 #include <fcntl.h> 11 #include <stdio.h> 12 #include <unistd.h> 13 14 #define CHECK(expr) \ 15 if ((expr) != 0) \ 16 err(1, #expr) 17 18 int 19 main() 20 { 21 uid_t real_uid, effective_uid; 22 int fd; 23 24 real_uid = getuid(); 25 effective_uid = geteuid(); 26 CHECK(setreuid(effective_uid, real_uid)); 27 28 CHECK(setreuid(real_uid, effective_uid)); 29 fd = open("/etc/hosts", O_RDONLY); 30 CHECK(setreuid(effective_uid, real_uid)); 31 close(fd), fd = -1; /* move this above the previous line */ 32 33 CHECK(setreuid(real_uid, effective_uid)); 34 printf("uid %d, euid %d\n", getuid(), geteuid()); 35 CHECK(setreuid(effective_uid, real_uid)); 36 return 0; 37 } 38 39