金丝雀为什么不在结构中有用?

时间:2011-12-18 14:32:20

标签: c

我们正在研究使用金丝雀来避免缓冲区溢出。

有一个问题是:

为什么金丝雀在这个结构中没有用?

struct test {
char arra[64];
int myVar;
}

我坚持下去。任何线索?

的Pd。这是家庭作业

3 个答案:

答案 0 :(得分:2)

我相信你的教授意味着它不会保护(肯定)你的结构中数组的溢出。编译器将canary值放在结构和堆栈末尾之间的某处。如果你的数组溢出小于int字节,溢出会破坏结构的int元素,而不是canary值(由于编译器选择的结构布局,这不准确)。因此,在这种情况下,溢出未被发现并且可能被利用。

答案 1 :(得分:1)

应该以这样的方式放置金丝雀:当缓冲区溢出时,第一个被破坏的数据应该是金丝雀,这样我们就可以对金丝雀的值进行验证检查,并设置溢出的警报。但在这种情况下,我可以做这样的事情,甚至不用修改金丝雀myVar的价值。

struct test t;
t.arra[100] = 1;

More about Canaries

答案 2 :(得分:0)

你在谈论stack canaries。直到现在我还没有听说过这个词。据我所知,你可以在char数组之前放置int myVar,但在WikiPedia示例中,它是一个浮点数。

为什么不打开边界检查?虽然程序运行速度较慢,但​​是检查C编译器中的边界不是吗?