system()和execve()之间有什么区别

时间:2014-10-19 08:42:12

标签: c system setuid execve

我使用linux和c。

首先,我软链接bin / zsh to sh

第二次,我以 root 的身份登录,运行以下程序。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
 char *v[3];
 if(argc < 2) {
  printf("Please type a file name.\n");
  return 1;
 }
 v[0] = "/bin/cat"; v[1] = argv[1]; v[2] = 0;
 /* Set q = 0 for system(), and q = 1 for execve */
 int q = 0;
 if (q == 0){
   char *command = malloc(strlen(v[0]) + strlen(v[1]) + 2);
   sprintf(command, "%s %s", v[0], v[1]);
   system(command);
 }
 else execve(v[0], v, 0);
 return 0 ; 
}

第三次,我以普通用户(非root用户)身份登录。 现在,我可以使用此程序的执行文件删除或重写我没有权限的文件。

像这样:

./a.out text;\`echo \”Not right\”>text\`”

现在我可以将“Not right”写入文件“text”。我只有这个文件的读权限

enter image description here

这些文件的读写权限。 enter image description here

第四次,我将q更改为1.这意味着,这次我使用的是execve。

做同样的事情。 但是这次我无法改变文件的内容。

为什么呢? 我在互联网上谷歌,但我找不到系统和execve之间的差异。

2 个答案:

答案 0 :(得分:3)

system调用shell来解析字符串并处理引用和变量插值和东西。 execve没有做到这一点。它用被调用的程序替换程序,并按照指定的方式传递参数字符串;即。它不会解释引号。

答案 1 :(得分:2)

你说你做过chmod 4755 a.out。这意味着您正在设置setuid位,然后程序将始终以root权限运行,并具有text的写入权限。带有反引号的字符串被传递给shell,它将其解释为写入text的命令。

execve不写入文本的原因是它不将其参数解释为shell命令,并且`没有任何特殊含义。