我使用 linux 和 c。

首先 ,我软链接(soft link) bin/zsh 到 sh

第二个 ,我以 根登录 运行以下程序。

#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”中。我只有这个文件的读取权限

这些文件的读写权限。

第四个 ,我把 q 改为 1。这意味着,这次我用 execve 代替。

并执行与上述相同的操作。
但是这次我无法更改文件的内容。

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

最佳答案

system 调用一个 shell 来解析字符串并处理引用和变量插值等等。 execve 不做这些。它将程序替换为被调用的程序,并完全按照指定的方式传递参数字符串; IE。它不会解释引号。

关于c - system() 和 execve() 有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26448841/

10-10 20:56