我一直在审查不同类型的缓冲区溢出,并遇到了一个我不记得为什么会发生的问题。下面的代码是我尝试执行缓冲区溢出的程序:
#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;
}
程序的核心概念很简单,我只是溢出缓冲区来覆盖返回地址func()
。当我给它一个地址时,一切都很好,例如0x0804850c
这恰好是<_fini>
的程序。当我使用该地址实现溢出时,最终结果是程序“优雅地”退出而不打印I'm done!
。我现在遇到的问题是当我尝试将返回地址重定向到位于以下位置的环境变量时0xbfffd89
.
位于该特定环境变量中的 shell 代码应该在执行完命令后退出程序hello
。然而这种情况并没有发生,程序只是简单地分段错误,仅此而已。 shell 代码已经被证实可以在我之前编写的测试 shell 代码的程序中工作。任何人都知道为什么这不起作用。谢谢
环境变量位于具有读写权限但没有执行权限的内存区域。我很容易地重现了这一点,如下所示:
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
void (*function)(void);
function = (void (*)(void))getenv("PATH");
function();
return 0;
}
运行在gdb
, 我懂了:
Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffeb51 in ?? ()
(gdb)
然后我查找地址 0x00007fffffffeb51 如果/proc/PID/maps
并发现这样一行:
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
有一个-
哪里的x
通常会找到(执行)位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)