pwn知识点1 elf的安全属性
正文
elf的安全属性
Arch
指的是编译环境或是编译器环境之类的。
RELRO
RELRO介绍
表示对是否有对数据区域的读写进行限制。
在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处。
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。(具体看RELRO类型)
RELRO类型
类型有三种:
Full RELRO完全开启只读保护,意味着.plt和.got.plt均为只读Partial RELRO部分开启只读保护,意味着plt只读,.got.plt可写No RELRO关闭只读保护,意味着.plt和.got.plt均可写。
- 注意:
.plt和.plt.got都在代码段,而.got和.got.plt在数据段。这四个东西还是略有不同。- 其中
plt.got好像是.plt表向.got的公共跳转代码(即所有函数完成延迟重定位是都经过这一部分获得.got的基准地址)。
- 其中
gcc编译时关于RELRO的控制
1 | gcc -o test test.c // 默认情况下,看环境 |
Stack Canary
Stack Canary功能介绍和原理解释
表示栈保护功能有没有开启。
- 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。
- 当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。
- 在Linux中我们将cookie信息称为canary。
gcc编译时关于canary功能的控制
1 | gcc -o test test.c //默认情况下,不开启Canary保护 |
NX
NX介绍
表示是否对内存有进行保护。
个人理解即:数据段禁止执行
linux上叫NX,windows上类似的叫DEP。
- NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行。
- 当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。
gcc编译时关于NX的控制
1 | gcc -o test test.c // 默认情况下,开启NX保护 |
PIE
先说明:PIE和ASLR不是一个东西。
且看这一篇吧:ASLR,PIE和PIC的异同
RPATH/RUNPATH
可以在编译时指定程序运行时动态链接库的搜寻路径,防止将一些动态库恶意替换,以达到攻击目的。
Debuginfo
使用gcc带-g调试选项编译的程序留有用于调试的一些记录,这样的程序会被checksec检测为:Debuginfo: Yes。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Phaero的世外桃源!
