75 run_setuid_fun(503);
76 //[5]此时 real uid= login user id
77 // effective uid = login user id
78 // saved uid = login user id
79 test_read_file(file);
80
81 cout<82 //[6]此时 real uid= login user id
83 // effective uid = login user id
84 // saved uid = login user id
85 // 运行setuid(0)是将返回错误值-1.
86 run_setuid_fun(0);
87 test_read_file(file);
88 return 0;
89 }
90
91
$ vi Makefile
1 src=setuid_ex.cpp
2 exe=setuid_ex
3 cc=g++
4 flags=-g
5
6 all:${src}
7 ${cc} ${flags} -o ${exe}
8 chown root:root ${exe}
9 ### 实际上chmod 4111改变了effective id 和saved uid的值.
10 ### 这也是setuid setruid函数在不同权限间正常切换的前提.
11 chmod 4111 ${exe}
$ sudo make #使用root进行Make.
$ ls -l setuid_ex
---s--x--x 1 root root 58579 Jan 15 11:27 setuid_ex
$ ./setuid_ex
TEST 1:
-----Current states--------------------------
real uid 503
effective uid 0
---------------------------------------------
=[OK]: read successful.
TEST 2: seteuid(getuid())
-----Current states--------------------------
real uid 503
effective uid 503
---------------------------------------------
=[ERROR]: read failed.
TEST 3: seteuid(0)
-----Current states--------------------------
real uid 503
effective uid 0
---------------------------------------------
=[OK]: read successful.
TEST 4: setuid(0)
-----Current states--------------------------
real uid 0
effective uid 0
---------------------------------------------
=[OK]: read successful.
TEST 5: setuid(503)
-----Current states--------------------------
real uid 503
effective uid 503
---------------------------------------------
=[ERROR]: read failed.
TEST 6: setuid(0)
=[ERROR]: setuid(0) error
-----Current states--------------------------
real uid 503
effective uid 503
---------------------------------------------
=[ERROR]: read failed.