
_START_ARTICLE_
栈缓冲区溢出
_START_SECTION_
保护方式
_START_PARAGRAPH_
常用三种方式来对抗栈缓冲区溢出攻击。
_START_SECTION_
检查栈缓冲区溢出的发生
_START_PARAGRAPH_
栈的警惕标志(stack canary)，得名于煤矿里的金丝雀，用于探测该灾难的发生。具体办法是在栈的返回地址的存储位置之前放置一个整形值，该值在装入程序时随机确定。栈缓冲区攻击时从低地址向高地址覆盖栈空间，因此会在覆盖返回地址之前就覆盖了警惕标志。返回返回前会检查该警惕标志是否被篡改。
_START_SECTION_
栈数据不可执行
_START_PARAGRAPH_
采取了“写异或执行”策略(W^X, "Write XOR Execute")，即内存要么可写，要么可执行，但二者不能兼得。这是最常用的方法，大部分桌面处理器都硬件支持不可执行标志（no-execute flag）。