gcc -fno-stack-protector用于链接不起作用

时间:2015-05-29 14:34:27

标签: gcc linker stack-overflow compiler-options

我的gcc版本:gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1)

以下是我的makefile

all : main.o utility.o                                                                                                                                                                                       
    gcc -fno-stack-protector -Wl,-z,execstack -o binary main.o utility.o -lcrypto
main : main.c
    gcc -z execstack -fno-stack-protector main.c -c
utility: utility.c
    gcc  -z execstack -fno-stack-protector utility.c -c

文件utility.o和main.o没有堆栈保护 但在链接后有一些堆栈守卫

objdump -D binary | grep chk
080488d0 <__stack_chk_fail@plt>:
 8048e30:   e8 9b fa ff ff          call   80488d0 <__stack_chk_fail@plt>
 80494dd:   e8 ee f3 ff ff          call   80488d0 <__stack_chk_fail@plt>
 80498e2:   e8 e9 ef ff ff          call   80488d0 <__stack_chk_fail@plt>
 8049b92:   e8 39 ed ff ff          call   80488d0 <__stack_chk_fail@plt>
 8049c9e:   e8 2d ec ff ff          call   80488d0 <__stack_chk_fail@plt>
 8049da2:   e8 29 eb ff ff          call   80488d0 <__stack_chk_fail@plt>
 804a137:   e8 94 e7 ff ff          call   80488d0 <__stack_chk_fail@plt>

如何禁用它?

1 个答案:

答案 0 :(得分:1)

  

以下是我的makefile
  gcc -z execstack -fno-stack-protector main.c -c

那命令是假的;如果它有什么应该-Wl,-z,execstack。但是,由于这是一个链接器选项,并且您没有在此处进行链接,因此最好完全删除-z exestack

  

但在链接后有一些堆栈守卫

__stack_chk_fail的调用必须来自链接到二进制文件的一些代码。可能来自libcrypto.alibgcc.a。您可以通过两种方式查看来自哪里:

gcc -fno-stack-protector -Wl,-z,execstack -o binary main.o utility.o \
 -lcrypto -Wl,-y,__stack_chk_fail

将生成如下消息:

/some/libfoo.a(bar.o): reference to __stack_chk_fail  # you care about this one!
/usr/lib/libc.so.6: definition of __stack_chk_fail

或者您可以使用已构建的二进制文件:

objdump -d binary | egrep '>:$|__stack_chk_fail' | grep -B1 __stack_chk_fail

这应该告诉你二进制引用__stack_chk_fail中的哪些函数,从中你应该能够猜出这些函数的来源。

P.S。除非您正在研究缓冲区溢出开发技术,否则禁用堆栈保护程序并与-z,execstack链接是非常糟糕的主意