太长,读不下去了
-z execstack
为可执行文件启用Linux的read暗示exec特性。尽管有这个名字,它也适用于
页面,而不仅仅是堆栈。
程序出错是因为
buffer
符号进入
.data
与其他部分一起依次进入映射为读写的ELF段的部分
不可执行
.
使
缓冲器
在这个新的部分。
原则上
使用以下链接器脚本:
PHDRS
{
MYSEG PT_LOAD FLAGS (7);
}
SECTIONS
{
MYSECT : { *(MYSECT) } : MYSEG
}
,更改源:
#include <stdio.h>
char buffer[] __attribute__ ((section ("MYSECT"))) ={0x90,0x90,0xC3};
int main(int argc, char *argv[])
{
void (*fct)();
fct=buffer;
fct();
return 0;
}
-T
但是这个
不会
GCC使用基于命令行和
-T型
可以使用
-Wl,-verbose
并更新它。
如果我们首先用
-c
然后,我们只能得到一个片段,因为这就是我们在链接器脚本中所做的-从而挫败了我们所做的所有努力
只有
缓冲器
唯一的可执行数据。
-z执行堆栈
实际上,我们只告诉GCC使用设置
GNU_STACK
ELF段RWE。
这是加载器用来为堆栈页设置正确权限的标记段(大小和lma为零)。
But in truth it is used as a compatibility switch
-当堆栈设置为可执行时,加载程序将设置
全部的
如果你在玩外壳代码
-z执行堆栈