system()和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什么都不做。它将程序替换为被调用的程序,并完全按照指定的方式传递参数字符串。IE。它不会解释引号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

Linux中的do_execve()和execve()有什么区别?

来自分类Dev

exec系列系统调用(例如exec和execve)的功能之间有什么区别?

来自分类Dev

“ as?”,“ as!”和“ as”有什么区别?

来自分类Dev

$ *和$ @有什么区别

来自分类Dev

$和〜有什么区别?

来自分类Dev

/ * ... * /和/ ** ... * /有什么区别

来自分类Dev

!=和<>有什么区别?

来自分类Dev

ö和ö有什么区别?

来自分类Dev

$ *和$ @有什么区别?

来自分类Dev

“ ==”和“ =〜”有什么区别?

来自分类Dev

= +和+ =有什么区别

来自分类Dev

$ @和$ *有什么区别

来自分类Dev

+ =和+有什么区别?

来自分类Dev

$ _和!$有什么区别?

来自分类Dev

\ 和 \\ 有什么区别

来自分类Dev

&&和||和有什么区别?

来自分类Dev

System.Diagnostics.Trace,System.Diagnostics.Debug和System.Console有什么区别?

来自分类Dev

System.Drawing.Image和System.Drawing.Bitmap有什么区别?

来自分类Dev

System.Drawing.Image和System.Drawing.Bitmap有什么区别?

来自分类Dev

!= null和!== null有什么区别?

来自分类Dev

ConnectEx和_ConnectEx有什么区别?

来自分类Dev

LDADD和LIBADD有什么区别?

来自分类Dev

tempfile和mktemp有什么区别?

来自分类Dev

setFocusable和setFocusableInTouchMode有什么区别?

来自分类Dev

MySQLi和PDO有什么区别?

来自分类Dev

Jini和RMI有什么区别?

来自分类Dev

TLS和PGAS有什么区别?

来自分类Dev

QRegularExpression和QRegExp有什么区别?