我使用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] 删除。
我来说两句