linuxd的二进制保护机制学习

一、二进制保护一共五种

1

ASLR

ASLR:地址空间随机化,proc/sys/kermel/randomize_va_space里的值可以控制系统级的ASLR,使用root权限可以进行修改,有三个值可以设置,具体说明如下。

  • 0:关闭 ASLR。
  • 1:mmap base、stack、vdsopage将随机化。这意味着“.so”文件将被加载到随机地址。链接时指定了-pie选项的可执行程序,其代码段加载地址将被随机化。配置内核时如果指定了CONFIG_COMPAT_BRK,则randomize_va_space 默认为1,此时 heap 没有随机化。
  • 2:在1的基础上增加了heap随机化。配置内核时如果禁用CONFIG_COMPAT_BRK,则randomize_va_space默认为2。ASLR 可以保证在每次程序加载的时候自身和所加载的库文件都会被映射到虚拟地址空间的不同地址处。

RELRO

RELRO: 重定位,一般会分为两种情况,即partial relro和full relro,具体区别就是前者重定位信息(如got表)可写,而后者不可写。

Stack

Stack:栈溢出保护,gcc编译程序默认开启,添加编译选项-fno-stack-protector会关闭程序的 stack canary 栈保护。

NX

NX:数据执行保护,即DEP(Data Execution Prevention),是指禁止程序在非可执行的内存区(non-executable memory)中执行指令。在80x86体系结构中,操作系统的内存管理是通过页面表(pege table)存储方式来实现的,其最后一位就是NX位,0表示允许执行代码,1表示禁止换行代码。一般来说,NX主要是防止直接在栈(stack)和堆(heap)上运行shellcode 代码。 gcc默认开启不可执行栈功能,添加编译选项-zexecstack即可开启栈可执行功能。

PIE

PIE:代码段随机化,具体见ASLR。