ELF保护机制

通过工具checksec可以查看ELF文件保护机制

gcc编译参数

NX:-z execstack / -z noexecstack (关闭 / 开启)
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启)
PIE:-no-pie / -pie (关闭 / 开启)
RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启)

RELRO (RELocation Read Only)

重定位表只读,重定位表即为.got.plt两个表。此项技术针对对GOT(Global Offset Table)的攻击。linux下RELRO有Partial RELROFull RELRO两种模式 。区别于:Partial RELRO模式下,GOT的非plt部分是只读的,而got.plt可写; Full RELRO模式下 ,整个GOT被标记为只读。

Canary(栈保护)

Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。在技术上表示最先的测试。
程序在初始化时会生成一个随机值(以x00结尾),并将其插入到返回值之前,函数返回前程序会检测该值是否有改动。如果发生栈溢出,canary的值被覆盖,程序就会崩溃。

NX(Non-Executable Memory)(windows 下为DEP)

NX是一项用于CPU的技术,可以确保数据、堆栈所在的内存页等不可执行,其他区域(如代码段)则不可写入。
启用NX后,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。绕过保护最常见的方法为ROP(Return-Oriented Programming) 。

ASLR(Address space layout randomization)

地址空间布局随机化,通过随机化关键数据区域的地址(堆、栈、libc库等)来防止攻击者定位攻击代码位置,迫使其不得不泄露相同的地址来计算基址。但是地址随机化不是对所有模块和内存区都进行随机化,虽然libc、栈、堆的加载位置被随机化,但主镜像不会,这也是绕过的关键手段。

PIE(Position-Independent Executable)

位置无关可执行文件。与ASLR类似,将基址随机化, 程序运行时的各个段加载的虚地址在装载时才确定。
在PIE和ASLR同时开启的情况下, 攻击者将对程序的内存布局一无所知, 传统的改写GOT表项的方法也难以进行, 因为攻击者不能获得程序的.got段的虚地址。

FORTIFY

用于检测对内存和字符串执行操作的各种函数中的缓冲区溢出。加了这个保护之后,一些敏感函数如read, fgets,memcpy, printf等等可能导致漏洞出现的函数都会被替换成 _read_chk,_fgets_chk_memcpy_chk,_printf_chk等。
这些带了chk的函数会检查读取/复制的字节长度是否超过缓冲区长度,通过检查诸如%n之类的字符串位置是否位于可能被用户修改的可写地址,避免了格式化字符串跳过某些参数(如直接%7$x)等方式来避免漏洞出现。
提供保护的函数还有memcpy, mempcpy, memmove, memset, strcpy, stpcpy, strncpy, strcat, strncat, sprintf, vsprintf, snprintf, vsnprintf, gets。

参考文章:

https://www.redhat.com/en/blog/hardening-elf-binaries-using-relocation-read-only-relro
http://ggb0n.cool/2020/05/13/入坑二进制/#more
https://blog.csdn.net/weixin_44932880/article/details/104092620
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/mitigation/canary/
https://access.redhat.com/blogs/766093/posts/1976213

原文地址:https://www.cnblogs.com/pluie/p/13053033.html