C代码的缓冲区溢出错误

时间:2012-07-17 09:42:33

标签: c pointers buffer-overflow

我在互联网上找到了一些C代码:

int main() {
    int cookie;
    char buf[80];

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 0x41424344)
        printf("you win!\n");
}

我尝试运行此代码,但它给出了运行时错误。我不确定为什么编译器抛出任何运行时错误,因为它只是创建两个变量并检查cookie值相等的一个条件。

根据一些说明cookie变量未初始化的答案,这就是我收到此错误的原因,所以我将代码修改为:

int main() {
    int cookie;
    char buf[80];

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 1)
        printf("you win!\n");
}

猜猜这次它不会给我任何运行时错误。

来源:http://community.coresecurity.com/~gera/InsecureProgramming/stack1.html

先谢谢

4 个答案:

答案 0 :(得分:2)

代码很好。许多编译器通过抛出运行时错误来“保护”您不使用未初始化的变量,缓冲区溢出等。您通常可以通过编译器标志关闭它。

答案 1 :(得分:0)

cookie尚未初始化

答案 2 :(得分:0)

编译器会在此代码上生成许多警告,用于在x中指定printf(期望整数类型)但是给出了指针。

此代码不应该给出任何运行时错误,除非您输入超过79个字符作为输入。关键是不应该使用gets,因为缓冲区(在上面的代码中在堆栈上分配)可以通过提供大输入来溢出,该输入溢出到堆栈并覆盖返回地址。利用这一点,攻击者可以提供恶意输入(将返回地址指向他的代码,也在输入中)并在系统上执行任意代码。

答案 3 :(得分:0)

您的“运行时错误”只是因为您的代码在return结尾处没有明确main而发生。最后粘贴return 0;,ideone.com不会报告错误。至少没有明智的投入;当然,这件事的关键在于看看你能用不明智的输入做些什么。