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

本文共 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

你可能感兴趣的文章
pat乙级1036-1040
查看>>
Pyhton开发:Python基础杂货铺
查看>>
Springboot 打jar包分离lib,配置文件正确方式
查看>>
剑指Offer_编程题_18
查看>>
剑指Offer_编程题_23
查看>>
我所理解的 Laravel 请求 生命周期
查看>>
数组的合并
查看>>
ARC070F HonestOrUnkind
查看>>
最好的浏览器版本解析
查看>>
IIS发布问题集锦
查看>>
vue实例-学习
查看>>
微信开发从未如此简单-饭前甜点之公众号的“你问我答”
查看>>
C#发送邮件时提示:“不允许使用邮箱名称。服务器响应为:”的错误解决办法...
查看>>
约束 CONSTRAINT
查看>>
二分查找实现
查看>>
[网络收集]Session+Hashtable实现购物车
查看>>
js如何实动态删除DIV
查看>>
c++ new 堆 栈
查看>>
该好好学习英语了
查看>>
IPFS的配置安装
查看>>