博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟Linux修改实际、有效和保存设置标识
阅读量:5167 次
发布时间:2019-06-13

本文共 2447 字,大约阅读时间需要 8 分钟。

就是模拟setuid seteuid setreuid setresuid,感觉代码比书上大段的文字好记,就写成代码形式了。

// setuid.cc: 模拟
中的设置用户ID的方法的作用#include
#include
int real = 0; // 实际用户IDint effective = 0; // 有效用户IDint saved = 0; // 保存的设置用户IDvoid showid(); // 打印所有IDinline bool hasPrivilege() { return effective == 0; }#define EINVAL_RETURN { errno = EINVAL; return -1; }#define EPERM_RETURN { errno = EPERM; return -1; }int setuid(int uid) // 修改所有用户ID{ if (uid < 0) EINVAL_RETURN; if (!hasPrivilege() && uid != real && uid != saved) EPERM_RETURN; if (hasPrivilege()) real = effective = saved = uid; else effective = uid; return 0;}int seteuid(int euid) // 修改有效用户ID{ if (euid < 0) EINVAL_RETURN; if (!hasPrivilege() && euid != real && euid != saved) EPERM_RETURN; effective = euid; return 0;}int setreuid(int ruid, int euid) // 修改实际/有效用户ID{ if (ruid < -1 || euid < -1) EINVAL_RETURN; if (!hasPrivilege()) { if (ruid != -1 && ruid != real && ruid != effective) EPERM_RETURN; if (euid != -1 && euid != real && euid != effective && euid != saved) EPERM_RETURN; } real = (ruid != -1) ? ruid : real; effective = (euid != -1) ? euid : effective; if (ruid != -1 || effective != real) saved = effective; return 0;}// 非SUSv3规范, 其他UNIX实现对其也鲜有支持int setresuid(int ruid, int euid, int suid) // 修改实际/有效/保存用户ID{ if (ruid < -1 || euid < -1 || suid < -1) EINVAL_RETURN; if (!hasPrivilege()) { if (ruid != -1 && ruid != real && ruid != effective && ruid != saved) EPERM_RETURN; if (euid != -1 && euid != real && euid != effective && euid != saved) EPERM_RETURN; if (suid != -1 && suid != real && suid != effective && suid != saved) EPERM_RETURN; } real = (ruid != -1) ? ruid : real; effective = (euid != -1) ? euid : effective; saved = (suid != -1) ? suid : saved; return 0;}int main(){ real = 1000; // 下面4句只能执行其中1句// setuid(2000); setreuid(-1, 2000);// seteuid(2000);// setresuid(-1, 2000, 3000); showid(); return 0;}void showid(){ printf("实际用户ID: %4d\n", real); printf("有效用户ID: %4d\n", effective); printf("保存的设置用户ID: %4d\n", saved);}

main函数是TLPI第9章习题第1道的运行结果,然后模拟了一遍功能,后面几道也很简单就能做出来了。以后忘记的话看遍代码就能很快记起来了。

转载于:https://www.cnblogs.com/Harley-Quinn/p/6676327.html

你可能感兴趣的文章
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
有关快速幂取模
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
Hive(7)-基本查询语句
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
js编码
查看>>
Pycharm Error loading package list:Status: 403错误解决方法
查看>>
steps/train_sat.sh
查看>>
转:Linux设备树(Device Tree)机制
查看>>
iOS 组件化
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>
(转)Linxu磁盘体系知识介绍及磁盘介绍
查看>>