【发布时间】:2015-01-18 20:47:46
【问题描述】:
我有几个关于 Stack Guard 和 SSP 保护的问题。第一个问题是关于 Stack Guard 及其三种类型的金丝雀,如果我没记错的话——终结者、随机和随机 XOR。
我想知道,如何在 x86 Linux 系统上禁用 Stack Guard?在我读到的某处,可以使用此命令,在使用 gcc '-disable-stackguard-randomization' 进行编译时,与启用 '-enable-stackguard-randomization 的命令相同strong>',两者都不起作用。如果需要,我的 gcc 版本是 4.8.2。
下一个关于 Stack 保护的问题,什么时候可以启用/禁用它,如何设置,我想使用哪种类型的金丝雀?我读到的,默认使用终结器金丝雀,对于随机我必须使用'-enable-stackguard-randomization'进行编译,但是随机异或呢? (或使用 null 0x00000000)
现在关于 SSP(ProPolice),我知道,对于随机金丝雀,我必须使用 'fstack-protector-all' 进行编译,但是终止符怎么样,它与 Stack 中的一样吗守卫,默认?
最后一位,如果你们中的任何人,可以告诉我,我可以在内存中找到随机金丝雀的位置。例如,我有这种情况 - 编译的 C 程序,如 'gcc -g example.c -o example -fstack-protector-all',所以使用随机金丝雀。比方说,每次执行后我都能获得金丝雀的地址。所以期待,我有:Canary = 0x1ae3f900。从不同的论文中,我得到了一些信息,金丝雀位于 .bss 段中。所以我使用 readelf 获得 .bss 段的地址:'readelf -a ./example | grep bss'。它是 080456c9。在 gdb 中我设置了一些断点,以获取金丝雀的地址,但是当我检查 .bss 地址 x/20x 0x080456c9 时,我看到的只是 0x00000000 地址,但是 金丝雀无处可去。另外,我检查了 __stack_chk_fail 是否不存在,但结果相同,我在那里看不到它。我从 PLT/GOT 得到 stack_chk_fail 的地址。
提前感谢您的回答和时间。
【问题讨论】:
-
另见Qualys Security Advisory - The Stack Clash OSS-Security 邮件列表。它展示了一些巧妙的技巧,以及它对保护页面的诅咒。令人惊讶的是,他们用它删除了多少操作系统。
-
您可以使用
gcc -fno-stack-protector或gcc -fstack-protector=strong编译来覆盖默认值。 When and how to use GCC's stack protection feature? 和 gcc.gnu.org/onlinedocs/gcc/…。另请参阅Why does this memory address %fs:0x28 ( fs[0x28] ) have a random value?,它指出正常的堆栈保护器会随机化堆栈 cookie。
标签: gcc random linux-kernel x86 protection