我使用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”。我只有这个文件的读权限
这些文件的读写权限。
第四次,我将q更改为1.这意味着,这次我使用的是execve。
做同样的事情。 但是这次我无法改变文件的内容。
为什么呢? 我在互联网上谷歌,但我找不到系统和execve之间的差异。
答案 0 :(得分:3)
system
调用shell来解析字符串并处理引用和变量插值和东西。 execve
没有做到这一点。它用被调用的程序替换程序,并按照指定的方式传递参数字符串;即。它不会解释引号。
答案 1 :(得分:2)
你说你做过chmod 4755 a.out
。这意味着您正在设置setuid
位,然后程序将始终以root权限运行,并具有text
的写入权限。带有反引号的字符串被传递给shell,它将其解释为写入text
的命令。
execve
不写入文本的原因是它不将其参数解释为shell命令,并且`没有任何特殊含义。