NX 保护 no execute(栈禁止执行)
*******可写的不可执行,可执行不可写(栈段,堆段呢?)****************
(又称DEP)数据执行保护。可写的不可执行,可执行的不可写
栈上的数据没有执行权限,防止攻击手段:栈溢出 + 跳到栈上执行 shellcode。
NX是英语“No eXecute”的简称,中文一般翻译成“禁止运行”,是一种CPU应用技术,用来把存储器区域分隔为只供
存储处理器指令集单元,或只供数据使用单元。任何使用NX技术的存储器,代表仅供数据使用,因此处理器的指
令集并不能在这些区域存储。
这种技术可防止大多数的缓冲溢出攻击,即一些恶意程序,把自身的恶意指令集放在其他程序的数据存储区并运行,
从而控制整台计算机。
Stack Canary(栈中多一个random)
********栈空间加个随机数,以检测是否被覆盖**********
在栈帧中插入一个随机数,函数执行完在返回之前,程序通过检查这个随机数是否改变来判断是否存在栈溢出。
PIE 与 ASLR (地址随机化)
PIE(Position Independent Executable) 位置独立可执行
ASLR stack、mmap以及堆区,这些区间的地址随机化。即便是shellcode打入到这些区域,因不知道地址,无法
跳转到。
Relro(GOT表重定向只读)
(Relocation Read-Only)重定向只读。*****GOT表只读********
其实GOT表是一个地址表(数据),只保存地址,PLT表是个代码表。刚开始GOT没有重定向,其指向PLT表,等被
重定向之后就更改为真是的地址。当然这个过程很复杂的,设计到的细节很多。
因此如果GOT表被劫持了,会发生什么。
RELRO为” Partial RELRO”时,说明我们对GOT表具有写权限。“FULL RELRO”表示我们只有读取权限
GOT(Global Offset Table)全局偏移表,保存了共享库(动态链接库)中函数实际地址(如printf(), gets()
…),PLT(Procedure Linkage Table)进程链接表,保存了对应GOT表项的地址。got表用于动态链接时候,
linux下加载使用GOT定位后间接寻址得到函数真实地址,每个got项伴随一个plt项用于跳转到got地址,等到函数
调用,got表写入真实地址,call函数的时候使用plt跳转到got得到真实地址。
好像还有个什么plt.got表的,细节忘了,有空再写
当然虽然开启了,还有一些绕过方式的,哈哈