0

我在网上找到了一些 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

4 回答 4

2

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

于 2012-07-17T09:47:13.643 回答
0

编译器将在此代码上生成许多警告,用于指定xin printf(需要整数类型)但给出了指针。

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

于 2012-07-17T09:48:52.090 回答
0

您的“运行时错误”只是因为您的代码没有return明确地在main. 坚持return 0;到底,ideone.com不会报错。至少没有明智的输入;当然,这件事的重点是看看你可以用不明智的输入做什么。

于 2012-07-17T10:05:52.260 回答
0

cookie尚未初始化

于 2012-07-17T09:46:19.980 回答