如何使C程序的堆栈可执行?

4
有没有一种方法可以通过编译使C程序的堆栈可执行?
我已经
$ gcc -o convert -g convert

然后运行。
$ readelf -l convert

要检查堆栈是否可执行,但输出结果是:

GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

6
为了您的精神健康,我希望这是为了学习安全漏洞而进行的。 - user253751
2个回答

6

正确的使栈可执行的方式不需要禁用堆栈canary,这与已接受答案所建议的不同。

以下是正确的方法:

gcc -z execstack ...

这是什么意思,就是将gcc-z选项传递给链接器[来源]:

关键字

-z与关键字关键字一起直接传递给链接器。请参阅您的链接器文档中的部分,了解允许的值及其含义。

来自man ld [来源]:

execstack

将对象标记为需要可执行堆栈。


1
OP在评论中提到另一个答案,说这个答案“解决了问题”,我认为很明显他的评论意味着这个答案是正确的,就好像他不小心接受了错误的答案。 - Jerry Jeremiah

-4

-fno-stack-protector 应该能满足你的需求。


4
你可能还需要加上“-Wl,-z,execstack”选项。(同时,原帖作者可能也会对这个链接感兴趣。) - nos
1
踩反对。栈保护标志与使栈可执行只有模糊的关系。 - jcsahnwaldt Reinstate Monica
@jcsahnwaldt 这是你的权利,但是:可执行堆栈并不意味着包含可执行代码... OP认为这就是它正在寻找的,但你比他更明智吗? - Jean-Baptiste Yunès
2
我不明白你的意思。只有在堆栈包含可执行代码时,将堆栈设置为可执行才有意义。无论是“-fno-stack-protector”还是“-fstack-protector”,都不会使堆栈变成可执行。它们添加了保护堆栈免受某些缓冲区溢出的代码。这是完全不同的事情。 - jcsahnwaldt Reinstate Monica
1
这个维基百科部分解释了问题的内容:https://en.wikipedia.org/wiki/Stack_buffer_overflow#Nonexecutable_stack 这个部分解释了你的回答是关于什么的:https://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries 相关但不同的事情。你的回答没有回答问题。 - jcsahnwaldt Reinstate Monica
提示:这显然是第一个评论的被接受答案。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接