Stack
常见的安全机制以及相关绕过方法
security cookies
编译的时候会在运行栈RET的上面加上一个随机的4字节数值(32位系统), 该值来自于(.data节的前四个字节,并通过一定的算法计算), 在函数运行栈前面会将该值与esp进行亦或并放置在栈中, 在函数返回前会对该值进行检查. 如果该值被修改将直接异常.
** 稳定利用主要思想是检查前利用(SEH, 虚表) **
Linux -fno-stack-protector
safeseh
在异常处理器被调用时, 会先检查, 若不满足条件则不会执行
检测方式(和操作系统以及编译器选项有关):
- 先获取栈的高地址和低地址, 通过查询TEB中的FS:[4]和FS:[8], 若指针指向该范围则不会执行.
- 检查是否在加载模块列表的某个模块的地址范围中, 继续检测 是否有”Load Configuration Directory”.
- 其余的有, 将SEH链复制一遍存储, 然后进行比较
DEP
使得栈区被覆盖的位置数据不允许执行, CPU的NX(无执行页-AMD), XD(不能执行-intel)
硬件DEP, 64位系统DEP总是开启, 不允许关闭(?)
ROP链
VirtualAlloc, VirtualProtect
ASLR
Windows
Linux使用 echo “0” > /proc/sys/kernel/randomize_va_space 关闭ASLR
/proc/sys/kernel/randomize_va_space:
0 关闭
1 开启
2 在1的基础上增加了heap随机化
Heap
常见的安全机制
safe unlink
freelists的保护
** 稳定利用可以借助快表(lookaside lists) **
lookaside攻击导致任意四字节写, 可以覆盖SEH, 然后执行一个除0异常导致利用
ASLR
** heap spray **
DEP
Linux NX:不可执行内存
** rop **