我有几个关于Stack Guard和SSP保护的问题。第一个问题是关于Stack Guard及其三种canaries的,如果我没记错的话——终止符、随机数和随机XOR。
我想知道如何在x86 Linux系统上禁用Stack Guard?我在某个地方读到,可以使用这个命令,在使用gcc编译时
-disable-stackguard-randomization
,就像启用的命令一样-enable-stackguard-randomization
,但两者都不起作用。如果需要,我的gcc版本是4.8.2。关于Stack guard的下一个问题,当我能够启用/禁用它时,如何设置我想要使用哪种类型的canaries?我所了解的是,默认情况下使用终止符canaries,对于随机canaries,我必须使用
-enable-stackguard-randomization
进行编译,但是随机XOR呢?(或者使用null 0x00000000)现在关于SSP(ProPolice),我知道,对于随机canary,我必须使用
fstack-protector-all
进行编译,但是对于终止符,与Stack Guard中的默认设置相同吗?最后一个问题,我在哪里可以找到内存中的随机canary?例如,我有这个场景-编译的C程序,如
gcc -g example.c -o example -fstack-protector-all
,因此具有随机canaries。假设我能够在每次执行后获取canary的地址。所以我期望Canary = 0x1ae3f900
。从不同的论文中,我得到了一些信息,即canary位于.bss段中。因此,我使用readelf获取了.bss段的地址:
readelf -a ./example | grep bss
。它是080456c9。在gdb中,我设置了一些断点,以获取canary的地址,但是当我检查.bss地址x/20x 0x080456c9
时,我只看到0x00000000地址,但是canary不在那里。此外,我检查了__stack_chk_fail
是否存在,但结果相同,我无法在那里看到它。我从PLT/GOT中获取了stack_chk_fail的地址。
gcc -fno-stack-protector
或gcc -fstack-protector=strong
来覆盖默认设置。关于何时以及如何使用GCC的堆栈保护功能,请参见When and how to use GCC's stack protection feature?和https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-fstack-protector。此外,还可以参考[Why does this memory address %fs:0x28 ( fs[0x28] ) have a random value?](//stackoverflow.com/q/10325713),该文章指出正常的堆栈保护会随机化堆栈cookie。 - Peter Cordes-fstack-protector-strong
,而不是=
。 - Peter Cordes