编写具有临时root权限的应用
2013-06-22 15:32
375 查看
本文以dpkg为例进行演示
关于setuid具体原理可查阅《Unix高级环境编程》“进程控制”章节关于“设置用户id和设置组id”的介绍
1. 首先需要通过setuid(0),让程序获取临时的root权限,此处操作容易受各方面影响(如权限)导致调用失败
2. 调用execl函数或system函数,执行dpkg
3. 还原setuid,确保恢复原始的执行权限
以上为代码编写方面的原则,以下几步为对可执行文件的权限设置
4. 使用gcc -o test test.c编译生成test可执行文件
5. 设置可执行文件权限,在设置前后可通过ls -l查看权限区别,此处可以在安装脚本中完成
sudo chown root:staff test
sudo chmod 4755 test
6. 编写test.sh, 调用exec ./test进行执行,因为exec会不会更改进程的uid
7. 运行测试,显示结果
直接上代码(代码中未对system返回值以及system执行信息进行处理,只为演示效果):
test.sh
by yytong
关于setuid具体原理可查阅《Unix高级环境编程》“进程控制”章节关于“设置用户id和设置组id”的介绍
1. 首先需要通过setuid(0),让程序获取临时的root权限,此处操作容易受各方面影响(如权限)导致调用失败
2. 调用execl函数或system函数,执行dpkg
3. 还原setuid,确保恢复原始的执行权限
以上为代码编写方面的原则,以下几步为对可执行文件的权限设置
4. 使用gcc -o test test.c编译生成test可执行文件
5. 设置可执行文件权限,在设置前后可通过ls -l查看权限区别,此处可以在安装脚本中完成
sudo chown root:staff test
sudo chmod 4755 test
6. 编写test.sh, 调用exec ./test进行执行,因为exec会不会更改进程的uid
7. 运行测试,显示结果
直接上代码(代码中未对system返回值以及system执行信息进行处理,只为演示效果):
#include<stdio.h> #include<unistd.h> #include<sys/types.h> int main(int argc, char **argv) { uid_t uid = getuid(); if(setuid(0)) { printf("setuid error"); return -1; } printf("run as root, setuid is 0\n"); // 临时具备root权限,可以正常执行 system("dpkg -i /Library/Caches/test.deb"); if(setuid(uid)) { printf("setuid error"); return -1; } printf("run as user, setuid is %d\n", uid); // 恢复用户权限,执行失败 system("dpkg -i /Library/Caches/test.deb"); return 0; }
test.sh
#!/bin/sh exec ./test
by yytong
相关文章推荐
- iphone上面编写具有root权限的程序
- 应用具有获取root权限
- 创建具有root权限的ios应用
- iphone上面编写具有root权限的程序
- iphone上面编写具有root权限的程序
- 创建具有root权限的ios应用
- 破解的iphone上, 如何编写具有root权限的程序
- 临时开放一个具有root权限的账户
- 破解的iphone上, 如何编写具有root权限的程序
- Android 应用通过init.rc启动service去执行具有root权限sh脚本
- 在iOS 系统上使应用具有root权限
- iphone上面编写具有root权限的程序
- 创建具有root权限的ios应用
- iphone上面编写具有root权限的程序
- 破解的iphone上, 如何编写具有root权限的程序
- WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类
- 汇编 编写、调试具有多个段的程序
- Dropwizard 编写Hello world应用
- 手把手教你编写一个具有基本功能的shell(已开源)
- Windows下 Qt 资源文件(.qrc)文件 的 编写与应用