zoukankan      html  css  js  c++  java
  • 编写具有临时root权限的应用

    本文以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执行信息进行处理,只为演示效果):

     1 #include<stdio.h>  
     2 #include<unistd.h>  
     3 #include<sys/types.h>  
     4 
     5 int main(int argc, char **argv)  
     6 {  
     7     uid_t uid = getuid();  
     8     if(setuid(0)) 
     9     {   
    10         printf("setuid error");  
    11         return -1;  
    12     }  
    13     printf("run as root, setuid is 0
    ");  
    14 
    15     // 临时具备root权限,可以正常执行
    16     system("dpkg -i /Library/Caches/test.deb");
    17 
    18     if(setuid(uid)) 
    19     {  
    20         printf("setuid error");  
    21         return -1;  
    22     }  
    23     printf("run as user, setuid is %d
    ", uid);  
    24 
    25     // 恢复用户权限,执行失败
    26     system("dpkg -i /Library/Caches/test.deb");
    27     return 0;                                                                                                                                                                                                                                                                 
    28 }

    test.sh

    1 #!/bin/sh
    2 
    3 exec ./test

    by yytong

  • 相关阅读:
    第二册二十一课
    第二册第二十课
    第二册第十九课
    第二册第十八课
    あなたがいるから (因为有你)
    flash 概要分析器
    this与回调函数
    cpp可变参笔记
    struct详解
    函数传递小结
  • 原文地址:https://www.cnblogs.com/ydhliphonedev/p/3149807.html
Copyright © 2011-2022 走看看