C中的缓冲区溢出攻击 - 无法覆盖堆栈

时间:2018-05-24 10:35:18

标签: c buffer overflow overwrite

最近我在我的大学里练习过缓冲区溢出攻击。虽然我这样做了,但从一开始我就有了一个问题,但似乎没有人能够清楚地回答它。

所以:我在程序中使用了两种不同的输入法:

  1. gets功能

  2. while fgetc函数循环

  3. 我在Linux中用gdb打开可执行文件,并使用32“A”的相同(大于缓冲区[12])输入运行它们。

    我不明白的事情:

    使用gets函数,堆栈被平滑覆盖,并引发分段错误:0x41414141? (),这是正常的。

    在while循环中使用fgetc函数,缓冲区正常被写入(12字节),之后 BUT ,尽管我给出的输入是额外的20字节(32字节总和) ),我看到0x0000000a跟随(它是'\ n'换行符char),它不属于那里,但最后。除此之外,在0x0000000a之后,它会跳过一些内存地址,并继续用其余的输入重写堆栈。

    为什么会这样?

    方法1:

    #include <stdio.h>
    
    void readString()
    {
        char buffer[12];    
        int i = 0;
        int c;
    
        /* Different input method */    
        gets(buffer);
        /* End*/
    
        puts(buffer);
    }
    
    int main()
    {
        puts("Please enter your name:\n");
        readString();       
    
        return 0;
    }
    

    方法2:

    #include <stdio.h>
    
    void readString()
    {
        char buffer[12];    
        int i = 0;
        int c;    
    
        /* Different input method */    
            while (1) {
            c = fgetc(stdin);
            if ((c == EOF) || (c == '\n'))
                break;   
            buffer[i++] = c;   
       }
        /* End*/
    
        puts(buffer);
    }
    
    int main()
    {
        puts("Please enter your name:\n");
        readString();       
    
        return 0;
    }
    

0 个答案:

没有答案