如何使C程序的堆栈可执行?
有没有办法通过编译使C程序的堆栈可执行 是的如何使C程序的堆栈可执行?,c,C,有没有办法通过编译使C程序的堆栈可执行 是的 $ gcc -o convert -g convert 然后跑 $ readelf -l convert 要检查堆栈是否可执行,但输出是否为: GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 -fno stack protector应该可以帮到你。使堆栈可执行的正确方法不需要禁用堆栈金丝雀,这与公认的答案不同 以下是正确的方法: gcc -z execs
$ gcc -o convert -g convert
然后跑
$ readelf -l convert
要检查堆栈是否可执行,但输出是否为:
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
-fno stack protector
应该可以帮到你。使堆栈可执行的正确方法不需要禁用堆栈金丝雀,这与公认的答案不同
以下是正确的方法:
gcc -z execstack ...
这样做的目的是,将gcc
的-z
选项传递给链接器[]:
关键词
-z与关键字一起直接传递给链接器。请参阅链接器文档中的部分以了解允许的链接
价值观及其意义
从man ld
[]:
execstack
将对象标记为需要可执行堆栈
为了您的理智,我希望这是为了了解安全漏洞。您可能还需要
-Wl,-z,execstack
选项。(而OP也可能会被问到)否决票。stack protector标志仅与使堆栈可执行有模糊的关系。@jcsahnwaldt这是您的权利,但:可执行堆栈并不意味着包含可执行代码。。。奥普以为这就是他要找的,但你觉得比他好?我不明白你的意思。只有当堆栈包含可执行代码时,使堆栈可执行才有意义。-fno-stack-protector
和-fstack-protector
都不会使堆栈可执行。它们添加了保护堆栈不受某些缓冲区溢出影响的代码。这是一件非常不同的事情。维基百科的这一部分解释了问题的内容:这一部分解释了你的回答是关于什么的:相关但不同的事情。你的回答并没有回答这个问题。OP对另一个答案发表评论说,这个答案“成功了”。我认为很明显,他的评论意味着这个答案是正确的——就好像他无意中接受了错误的答案一样。