我的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>
如何禁用它?
答案 0 :(得分:1)
以下是我的makefile
gcc -z execstack -fno-stack-protector main.c -c
那命令是假的;如果它有什么应该-Wl,-z,execstack
。但是,由于这是一个链接器选项,并且您没有在此处进行链接,因此最好完全删除-z exestack
。
但在链接后有一些堆栈守卫
对__stack_chk_fail
的调用必须来自链接到二进制文件的一些代码。可能来自libcrypto.a
或libgcc.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
链接是非常糟糕的主意。