2011-12-18 102 views
2

我们正在研究使用金丝雀避免缓冲区溢出。为什么金丝雀对结构没有帮助?

有一个问题是:

为什么在这个结构中不是有用的金丝雀?

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

我被卡住了。任何线索?

Pd。这是作业

回答

2

我相信你的教授意味着它不会保护(肯定)从结构内的阵列的溢出。编译器将该Canary值放置在您的结构和堆栈的结尾之间。如果你的数组溢出的数量少于int字节,溢出会破坏你的结构的int元素,而不是canary的值(这是因为编译器选择的结构布局不准确)。所以在这种情况下,溢出不会被发现并且可以被利用。

0

你在说关于stack canaries。直到现在我还没有听说过这个词。据我所知,你会把int myVar放在char数组之前,但在WikiPedia的例子中,它是一个浮点数。

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

+0

绑定检查不能很容易地与C广泛使用的指针算术调和。你一定在想另一种语言。 – 2011-12-18 14:43:22

1

Canaries应该放置在缓冲区溢出时,第一个被损坏的数据应该是canary,这样我们才能对canary的值进行验证检查,并根据这个值设置溢出警报。但在这种情况下,我可以做这样的事情,甚至没有修改金丝雀myVar的价值。

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

More about Canaries

+0

MyVar不是金丝雀。 – gnometorule 2011-12-18 15:01:39