我想知道为什么缓冲区溢出漏洞在特定场景中不起作用。到目前为止,我正在处理的溢出可以重定向返回地址,当我专注于一块内存时说<_fini>
,程序将退出而不执行函数之后的任何其他操作。奇怪的是当我尝试将内存重定向到环境变量时。由于某些原因,由于分段错误,这不起作用。任何人都有任何想法,为什么会这样?
这是代码
#include <stdio.h>
void func(char *buff){
char buffer[5];
strcpy(buffer, buff);
printf("%s\n", buffer);
}
int main(int argc, char *argv[]){
func(argv[1]);
printf("I'm done!\n");
return 0;
}
答案 0 :(得分:1)
我使用环境变量写了一篇关于缓冲区溢出的文章,这可能对你有所帮助:http://pinkmist.dyndns.org:8080/2012/04/24/basic-stack-overflow/。有许多事情可能导致您的问题。我不得不问,你是否尝试过编写没有环境变量的缓冲区溢出?我发现使用环境变量可以使事情变得更容易,但它可能是一个很好的学习练习,可以帮助你理解为什么这些工作有效。我在上面提到的另外几件事情是:ASLR和GCC上的堆栈粉碎保护。这些事情中的任何一个都可以真正阻碍你的一天。确保您已禁用ASLR和堆栈粉碎保护(默认情况下,在任何现代发行版中均处于启用状态)。
答案 1 :(得分:0)
您可能正在尝试在具有数据执行保护(DEP)的系统上利用二进制文件。这意味着环境区域以及几乎所有其他不是二进制代码及其库的代码都将位于标记为不可执行的内存页面中 - 当您尝试执行其中的任何内容时会导致分段错误。
删除保护(确切的过程取决于操作系统)或限制自己标记为可执行的内存地址。