CentOS7中自编的一个支持suid的system函数(c语言)

在CentOS7中,exec函数族支持suid,但是system的函数不支持suid。由于exec族函数调用的参数远多于system函数(因为system的参数只要一个字符串),在很多情况下不如system便捷。这里本人将利用execvp函数,来实现一个能支持suid的system函数,命名为system_pri。

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <malloc.h>


static int system_pri(char *);


int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Usage: stringctl.exe \"<arguments>\"\n");
return -1;
}
else
{
if(system_pri(argv[1]) == -1)
{
printf("system_pri error\n");
return -1;
}
}
printf("continued\n");
return 0;
}


static int system_pri(char *argv)
{
int snum;
int i, j, k;
char **cmd;
int **begin_end;
pid_t pid;
int status;
snum = 0;
if(argv[0] != ' ')
snum++;
for(i = 0; i < strlen(argv); i++)
{
if(argv[i] == ' ' && argv[i+1] != ' ' && argv[i+1] != '\n' && argv[i+1] != '\0')
snum++;
}
begin_end = (int **)malloc(snum*sizeof(int *));
for(i = 0; i < snum; i++)
begin_end[i] = (int *)malloc(2*sizeof(int));
j = 0;
if(argv[0] != ' ')
{
begin_end[0][0] = 0;
j++;
}
for(i = 0; i < strlen(argv); i++)
{
if(argv[i] == ' ' && argv[i+1] != ' ' && argv[i+1] != '\n' && argv[i+1] != '\0')
{
begin_end[j][0] = i+1;
j++;
}
}
j = 0;
for(i = 0; i < strlen(argv); i++)
{
if((argv[i+1] == ' ' || argv[i+1] == '\n' || argv[i+1] == '\0') && argv[i] != ' ' && argv[i] != '\n' && argv[i] != '\0')
{
begin_end[j][1] = i;
j++;
}
}
cmd = (char **)malloc((++snum)*sizeof(char *));
for(i = 0; i < snum-1; i++)
{
cmd[i] = (char *)malloc((begin_end[i][1]-begin_end[i][0]+2)*sizeof(char));
}
j = 0;
k = 0;
for(i = 0; i < strlen(argv); i++)
{
if(i >= begin_end[j][0] && i <= begin_end[j][1])
cmd[j][k++] = argv[i];
if(i == begin_end[j][1])
{
cmd[j++][k] = '\0';
k = 0;
}
if(j == snum-1)
break;
}
if((pid = fork()) < 0)
{
perror("system_pri fork");
return -1;
}
else if(pid == 0)
{
if(execvp(cmd[0], cmd) == -1)
{
perror("system_pri execvp");
return -1;
}
return -1;
}
else
{
if(waitpid(pid, &status, 0) != pid)
{
perror("system_pri waitpid");
return -1;
}
else
{
for(i = 0; i < snum-1; i++)
free(begin_end[i]);
free(begin_end);
for(i = 0; i < snum; i++)
free(cmd[i]);
free(cmd);
return 0;
}
return -1;
}
return -1;
}

上述程代码可由gcc编译。main函数的出现只是为了验证system_pri函数的效果,实现system_pri函数只需要头文件和system_pri函数体就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值