Linux下程序的保护机制(checksec)

Linux下程序的保护机制

前言

相信很多人,查看程序信息时会用到,checksec这个命令。它会给你返回如下图的结果,但是很多最开始看到的人,很多都看不懂,如果身为小白的我,跟在大佬后面比葫芦画瓢,这样用。这篇博文就是用来解释下面信息的,希望对你有所帮助,同时也是为了以后自己忘记可以回顾。

Stack Canary

Stack Canray是专门针对栈溢出攻击涉及的一中保护机制。由于栈溢出攻击的主要目标是通过溢出覆盖函数栈高位的返回地址,因此其思路是在函数开始执行前,即返回地址前写入一个字长的随机数据(canary),在函数返回前校验该值是否被改变,如果改变则认为是栈溢出,程序直接终止,以此来防止信息泄露。

GCC默认使用Stack Canary保护,关闭方法编译时加入“-fno-stack-protector”参数

ALSR

ALSR,全称 Address Space Layout Randomization(地址空间分布随机化)。目的是将程序的堆栈地址和动态链接库的加载地址进行一定的随机化,这些地址之间是不可读写执行的未映射内存,降低攻击者对程序内存结构的了解程序。这样,即使攻击者布置了shellcode 并可以控制转跳,由于内存地址结构的未知,依然无法执行shellcode。

ASLR是系统等级的保护机制,关闭方式是修改/proc/sys/kernel/randomize_va_space文件的内容为0

PIE

与ASLR保护十分类似,PIE保护的目的是让可执行程序ELF的地址进行随机化加载,从而使得程序的内存结构对攻击者完全未知。

GCC编译时开启PIE的方法是添加参数 “-fpic -pie”,关闭的方法为“-no-pie”。

NX

NX保护在window中也被称为 DEP,是通过现代操作系统的内存保护单元机制对程序内存按页的粒度进行权限设置,其基本规则为可写权限与可执行权限互斥,基本规则是将数据所在内存页标识为不可执行。开启NX保护后,所有可以被修改写入shellcode的内存都不可执行,所有可以被执行的代码数据都不可被修改

GCC默认开启NX保护,关闭方法是编译时加入“-z execstack”参数

RELRO

在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。 所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处.

GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: read only relocation。大概实现就是由linker指定binary的一块经过dynamic linker处理过 relocation之后的区域为只读.

设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。

猜你喜欢

转载自blog.csdn.net/Y_peak/article/details/113572153
今日推荐