Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使C程序的堆栈可执行?_C - Fatal编程技术网

如何使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

有没有办法通过编译使C程序的堆栈可执行

是的

$ 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对另一个答案发表评论说,这个答案“成功了”。我认为很明显,他的评论意味着这个答案是正确的——就好像他无意中接受了错误的答案一样。