我在互联网上找到了一些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
先谢谢
答案 0 :(得分:2)
代码很好。许多编译器通过抛出运行时错误来“保护”您不使用未初始化的变量,缓冲区溢出等。您通常可以通过编译器标志关闭它。
答案 1 :(得分:0)
cookie
尚未初始化
答案 2 :(得分:0)
编译器会在此代码上生成许多警告,用于在x
中指定printf
(期望整数类型)但是给出了指针。
此代码不应该给出任何运行时错误,除非您输入超过79个字符作为输入。关键是不应该使用gets
,因为缓冲区(在上面的代码中在堆栈上分配)可以通过提供大输入来溢出,该输入溢出到堆栈并覆盖返回地址。利用这一点,攻击者可以提供恶意输入(将返回地址指向他的代码,也在输入中)并在系统上执行任意代码。
答案 3 :(得分:0)
您的“运行时错误”只是因为您的代码在return
结尾处没有明确main
而发生。最后粘贴return 0;
,ideone.com不会报告错误。至少没有明智的投入;当然,这件事的关键在于看看你能用不明智的输入做些什么。