正文

elf的安全属性

Arch

指的是编译环境或是编译器环境之类的。

RELRO

RELRO介绍

表示对是否有对数据区域的读写进行限制。

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

设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。(具体看RELRO类型)

RELRO类型

类型有三种:

  1. Full RELRO 完全开启只读保护,意味着.plt.got.plt均为只读
  2. Partial RELRO 部分开启只读保护,意味着plt只读,.got.plt可写
  3. No RELRO 关闭只读保护,意味着.plt.got.plt均可写。
  • 注意:.plt.plt.got都在代码段,而.got.got.plt在数据段。这四个东西还是略有不同。
    • 其中plt.got好像是.plt表向.got的公共跳转代码(即所有函数完成延迟重定位是都经过这一部分获得.got的基准地址)。

gcc编译时关于RELRO的控制

1
2
3
4
gcc -o test test.c						// 默认情况下,看环境
gcc -z norelro -o test test.c // 关闭,即No RELRO
gcc -z lazy -o test test.c // 部分开启,即Partial RELRO
gcc -z now -o test test.c // 全部开启,即

Stack Canary

Stack Canary功能介绍和原理解释

表示栈保护功能有没有开启。

  • 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。
  • 当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。
  • 在Linux中我们将cookie信息称为canary。

gcc编译时关于canary功能的控制

1
2
3
4
gcc -o test test.c                           //默认情况下,不开启Canary保护
gcc -fno-stack-protector -o test test.c //禁用栈保护
gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有char数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码,只有这种情况checksec才会显示canaryfound

NX

NX介绍

表示是否对内存有进行保护。

个人理解即:数据段禁止执行

linux上叫NX,windows上类似的叫DEP。

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

gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。

gcc编译时关于NX的控制

1
2
3
gcc -o test test.c                        // 默认情况下,开启NX保护
gcc -z execstack -o test test.c // 禁用NX保护
gcc -z noexecstack -o test test.c // 开启NX保护

PIE

先说明:PIE和ASLR不是一个东西

且看这一篇吧:ASLR,PIE和PIC的异同

RPATH/RUNPATH

可以在编译时指定程序运行时动态链接库的搜寻路径,防止将一些动态库恶意替换,以达到攻击目的。

Debuginfo

使用gcc-g调试选项编译的程序留有用于调试的一些记录,这样的程序会被checksec检测为:Debuginfo: Yes