繁体   English   中英

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

[英]What's the difference between system() and execve()

我使用linux和c。

首先 ,我将bin / zsh软链接到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\`”

现在,我可以将“不正确”写入文件“文本”。 我只有这个档案的读取权限

在此处输入图片说明

这些文件的读写特权。 在此处输入图片说明

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

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

为什么? 我在互联网上用google搜索,但找不到system和execve之间的区别。

system调用外壳程序以解析字符串并处理引号以及变量插值和填充。 execve不执行任何操作。 它将程序替换为被调用的程序,并完全按照指定的方式传递参数字符串。 即。 它不会解释引号。

您说过您在chmod 4755 a.out 这意味着您正在设置setuid位,然后程序将始终以root特权运行,并且具有对text写访问权。 带反引号的字符串被传递到外壳,外壳将其解释为写入text的命令。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM