操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX)、ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的。这些都会影响程序漏洞的编写。
执行./checksec --file XXX或者在gdb(已经装好插件peda)中键入checksec可以得到程序的安全机制特点。
Canary是Linux众多安全保护机制中的一种,主要用于防护栈溢出攻击。它的主要思想是在刚进入函数时,在栈上放置cookie信息,在函数结束时,判断该标志是否被改变,如果被改变,则表示有攻击行为发生,转入处理函数。在gcc编译的时候 -fstack-protector-all:启用堆栈保护,为所有函数插入保护代码。
Fortify将替换strcpy, memcpy, memset等函数名,达到防止缓冲区溢出的作用。例如将strcpy变成__strcpy_chk之类。用包含参数-D_FORTIFY_SOURCE=2编译
NX即No-Execute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序尝试在数据页面上执行,此时CPU就会抛出异常,而不是去执行恶意指令。编译器添加-z execstack参数
PIE(ASLR)地址空间分布随机化;
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码
RELRO设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。
(GOT表用于动态链接时候,linux下加载使用GOT定位后间接寻址得到函数真实地址,每个got项伴随一个plt项用于跳转到got地址,等到函数调用,got表写入真实地址,call函数的时候使用plt跳转到got得到真实地址)
网友评论