我们正在研究使用金丝雀来避免缓冲区溢出。
有一个问题是:
为什么金丝雀在这个结构中没有用?
struct test {
char arra[64];
int myVar;
}
我坚持下去。任何线索?
的Pd。这是家庭作业
答案 0 :(得分:2)
我相信你的教授意味着它不会保护(肯定)你的结构中数组的溢出。编译器将canary值放在结构和堆栈末尾之间的某处。如果你的数组溢出小于int字节,溢出会破坏结构的int元素,而不是canary值(由于编译器选择的结构布局,这不准确)。因此,在这种情况下,溢出未被发现并且可能被利用。
答案 1 :(得分:1)
应该以这样的方式放置金丝雀:当缓冲区溢出时,第一个被破坏的数据应该是金丝雀,这样我们就可以对金丝雀的值进行验证检查,并设置溢出的警报。但在这种情况下,我可以做这样的事情,甚至不用修改金丝雀myVar
的价值。
struct test t;
t.arra[100] = 1;
答案 2 :(得分:0)
你在谈论stack canaries。直到现在我还没有听说过这个词。据我所知,你可以在char数组之前放置int myVar,但在WikiPedia示例中,它是一个浮点数。
为什么不打开边界检查?虽然程序运行速度较慢,但是检查C编译器中的边界不是吗?