这是一个set-root-uid程序
$ls -l
-rwsr-sr-x 1 root root 7406 2011-12-13 22:37 ./x*
int main(void) {
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
seteuid(600);
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
setuid(1000);
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
setuid(0); // HOW DOES THIS SUCCEED IN SETTING THE EUID BACK TO 0
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
return 0 ;
}
UID GID
Real 1000 Real 1000
Effective 0 Effective 0
UID GID
Real 1000 Real 1000
Effective 600 Effective 0
UID GID
Real 1000 Real 1000
Effective 1000 Effective 1000
UID GID
Real 1000 Real 1000
Effective 0 Effective 1000
手册页指出setuid将更改实际,保存和有效的uid。因此,在通话后setuid(1000)
,所有三个都更改为1000
。那setuid(0)
让我如何更改euid
为0
?
有两种情况
- 您想在执行setuid程序时暂时放弃root特权
- 您想在执行setuid程序时永久放弃root特权…
情况1:
setuid程序开始执行后
1.seteuid(600);
2.setuid(1000);
3.setuid(0);
在这种情况下,可以再次获得root特权。
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000| 0 | 0 |
2.|1000| 600 | 0 |
3.|1000| 1000 | 0 |
4.|1000| 0 | 0 |
| | | |
+------------------------+
情况2:
setuid程序开始执行后 ,
1.setuid(1000);
2.setuid(0);
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000|0 | 0 |
2.|1000|1000 | 1000 |
| | | |
+------------------------+
在这种情况下,您无法取回root特权。可以通过以下命令进行验证,
cat / proc / PROCID / task / PROCID /状态| 减
Uid: 1000 0 0 0
Gid: 1000 0 0 0
此命令将显示一个Uid和Gid,它将具有4个字段(前三个字段是我们关注的字段)。像上面的东西
这三个字段代表uid,euid和saveed-user-id。您可以在setuid程序中引入一个暂停(来自用户的输入),并检查cat /proc/PROCID/task/PROCID/status | less
命令的每个步骤。在每个步骤中,您都可以检查保存的uid是否如前所述进行更改。
如果您的euid是root用户,并且更改了uid,则特权将被永久删除。如果有效的用户ID不是root用户,则保存的用户ID不会被触及,您可以在程序中随时重新获得root特权。
登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中。 说白了,用户名并无实际作用,仅是为了方便用户的记忆而已。 要论证 "Linux系统不认识用户名" 也很简单,在前面章节,我们曾经在网络上下载过 ".tar
问题内容: 实际的UID,有效的UID,以及某些系统甚至具有“已保存的UID”。所有这些的目的是什么,尤其是最后一个? 问题答案: 每个UNIX进程都有3个与之关联的UID。超级用户特权是UID = 0。 真实的UID 这是创建此流程的用户/流程的UID。仅当正在运行的进程的EUID = 0时才可以更改。 有效的UID 此UID用于评估执行特定操作的进程的特权。如果EUID!= 0,则可以将EUI
我在HTC DESIRE 626GPlus双SIM卡和Android 4.4.2上得到了这个错误
问题内容: 我想通过NodeJS或Javascript API从Firebase提取Auth User(s)UID。我已经为其附上了屏幕截图,以便您了解我在寻找什么。 希望你们能帮助我。 问题答案: Auth数据在Firebase 3中是异步的。因此,您需要等待事件,然后才能访问当前登录用户的UID。您将无法获得其他人。应用也会同时打开时会被调用。 如果愿意,您也可以仅在收到事件后才渲染您的应用程
问题内容: 我想获得Mifare Ultralight NFC标签的UID。在Java中,我有以下代码: 问题是我收到两个字节而不是UID。有什么问题?APDU是否正确? 问题答案: 您实际使用的命令不是您期望的。 使用此阅读器获取UID /序列号/枚举标识符的正确命令APDU为: 但是,您使用的构造函数定义为: 所以用 要创建一个C-APDU以下参数,,,。到目前为止,这与上述APDU相同。但是
此错误“”getter'uid'在null上被调用。receiver:null尝试调用:uid“ 退出按钮: 控制台: widgets库捕获的异常接收者:null尝试调用:uid 相关的导致错误的小部件是:Qr file://g://androidstudioprojects/facem/lib/screens/home/home.dart:687:67当抛出异常时,这是堆栈:#0 object.