首页 > 解决方案 > C中的缓冲区溢出攻击 - 无法覆盖堆栈

问题描述

最近我在大学里做了一个关于缓冲区溢出攻击的练习。虽然我做到了,但我从一开始就有一个问题,但似乎还没有一个明确的答案。

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

  1. gets功能

  2. fgetc带函数的while循环

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

我不明白的是:

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

在while循环中使用fgetc函数,缓冲区通常被写入(12字节),在那之后,虽然我给的输入是额外的20字节(32字节总和),但我看到后面跟着0x0000000a(这是'\ n' newline char) 不属于那里,但在最后。除此之外,在 0x0000000a 之后,它会跳过一些内存地址并继续用其余的输入再次覆盖堆栈。

为什么会这样?

方法一:

#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;
}

方法二:

#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;
}

标签: cbufferoverflowoverwrite

解决方案


推荐阅读