我们正在研究使用金丝雀避免缓冲区溢出。为什么金丝雀对结构没有帮助?
有一个问题是:
为什么在这个结构中不是有用的金丝雀?
struct test {
char arra[64];
int myVar;
}
我被卡住了。任何线索?
Pd。这是作业
我们正在研究使用金丝雀避免缓冲区溢出。为什么金丝雀对结构没有帮助?
有一个问题是:
为什么在这个结构中不是有用的金丝雀?
struct test {
char arra[64];
int myVar;
}
我被卡住了。任何线索?
Pd。这是作业
我相信你的教授意味着它不会保护(肯定)从结构内的阵列的溢出。编译器将该Canary值放置在您的结构和堆栈的结尾之间。如果你的数组溢出的数量少于int字节,溢出会破坏你的结构的int元素,而不是canary的值(这是因为编译器选择的结构布局不准确)。所以在这种情况下,溢出不会被发现并且可以被利用。
你在说关于stack canaries。直到现在我还没有听说过这个词。据我所知,你会把int myVar放在char数组之前,但在WikiPedia的例子中,它是一个浮点数。
为什么不打开边界检查?尽管程序运行速度较慢,但是在C编译器中的边界检查不是吗?
Canaries应该放置在缓冲区溢出时,第一个被损坏的数据应该是canary,这样我们才能对canary的值进行验证检查,并根据这个值设置溢出警报。但在这种情况下,我可以做这样的事情,甚至没有修改金丝雀myVar
的价值。
struct test t;
t.arra[100] = 1;
MyVar不是金丝雀。 – gnometorule 2011-12-18 15:01:39
绑定检查不能很容易地与C广泛使用的指针算术调和。你一定在想另一种语言。 – 2011-12-18 14:43:22