linux--gcc编译选项

1、安全编译选项

        操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在使用gcc进行编译时,可以使用gcc的编译选项来避免堆栈溢出、整数溢出等问题。

2、checksec.sh

Checksec是一个bash脚本,用于检查可执行文件的属性(如PIE,RELRO,PaX,Canaries,ASLR,Fortify Source)。它最初由Tobias Klein编写,原始资料来源www.trapkit.de/tools/checksec.html,github地址:https://github.com/slimm609/checksec.sh

3、ASLR(地址随机化)

        ASLR(Address Space Layout Randomization,地址空间布局随机化)是一种针对缓冲区溢出的安全保护技术。借助ASLR,PE文件每次加载到内存的起始地址都会随机变化。目前大部分主流操作系统都已经实现了ASLR,ASLR需要操作系统和程序自身的双重支持。ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack、heap、libraries的基址

   ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。

       ASLR虽然增加了编写恶意代码的难度,但是仍存在很多绕过方式,如攻击未启用ASLR的模块、堆喷射(HeapSpray)、覆盖部分返回地址、Java applet heap spray等。因此,想要真正防御缓冲区溢出,还需要综合使用多种安全保护技术。

linux开启该功能:

echo 0 >/proc/sys/kernel/randomize_va_space

0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。

4、PIE

        ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack、heap、libraries的基址;而PIE(Position Independent Executables)是编译器(gcc,..)功能选项(-fPIE),作用于excutable编译过程,可将其理解为特殊的PIC(so专用,Position Independent Code),加了PIE选项编译出来的ELF用file命令查看会显示其为so,其随机化了ELF装载内存的基址(代码段、plt、got、data等共同的基址)。

参考链接:https://www.cnblogs.com/rec0rd/p/7646857.html

5、PIC

       共享对象可能会被不同的进程加载到不同的位置上,如果共享对象中的指令使用了绝对地址、外部模块地址,那么在共享对象被加载时就必须根据相关模块的加载位置对这个地址做调整,也就是修改这些地址,让它在对应进程中能正确访问,而被修改到的段就不能实现多进程共享一份物理内存,它们在每个进程中都必须有一份物理内存的拷贝。fPIC指令就是为了让使用到同一个共享对象的多个进程能尽可能多的共享物理内存,它背后把那些涉及到绝对地址、外部模块地址访问的地方都抽离出来,保证代码段的内容可以多进程相同,实现共享。

参考链接:https://blog.csdn.net/lcwyan/article/details/71172869

6、NX

      NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

参考链接:https://www.cnblogs.com/Spider-spiders/p/8798628.html

 

你可能感兴趣的:(Linux专栏)