在我正在阅读的书中,软件驱魔,有这个缓冲区溢出的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 4
void victim(char *str)
{
char buffer[BUFFER_SIZE];
strcpy(buffer,str);
return;
}
void redirected()
{
printf("\tYou've been redirected!\n");
exit(0);
return;
}
void main()
{
char buffer[]=
{
'1','2','3','4',
'5','6','7','8',
'\x0','\x0','\x0','\x0','\x0'
};
void *fptr;
unsigned long *lptr;
printf("buffer = %s\n", buffer);
fptr = redirected;
lptr = (unsigned long*)(&buffer[8]);
*lptr = (unsigned long)fptr;
printf("main()\n");
victim(buffer);
printf("main()\n");
return;
}
我可以通过指定使用 Visual Studio 2010 在 Windows 中使用它
- 基本运行时检查 -> 未初始化的变量
- 缓冲区安全检查 -> 否
使用这些编译选项,我在运行时会得到这种行为:
buffer = 12345678
main()
You've been redirected!
我的问题是关于无法在 Linux 上运行的代码。有什么明确的原因吗?
关于我尝试过的一些信息:
我尝试使用 32 位 Ubuntu 12.04(从此处下载)运行它,使用以下选项:
[09/01/2014 11:46] root@ubuntu:/home/seed# sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space = 0
得到:
[09/01/2014 12:03] seed@ubuntu:~$ gcc -fno-stack-protector -z execstack -o overflow overflow.c
[09/01/2014 12:03] seed@ubuntu:~$ ./overflow
buffer = 12345678
main()
main()
Segmentation fault (core dumped)
在 64 位 CentOS 6.0 中,具有以下选项:
[root]# sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space = 0
[root]# sysctl -w kernel.exec-shield=0
kernel.exec-shield = 0
得到:
[root]# gcc -fno-stack-protector -z execstack -o overflow overflow.c
[root]# ./overflow
buffer = 12345678
main()
main()
[root]#
Linux 环境中是否有一些根本不同的东西,这会导致示例无法正常工作,或者我在这里遗漏了一些简单的东西?
注意:我已经完成了相关问题,例如this one和this one,但找不到任何对此有帮助的东西。我不认为这是以前问题的重复,即使它们有很多。