栈溢出常见利用方式
ret2text
ret2syscall
ret2shellcode
ret2libc
ropchain
栈溢出防护
canary
- CANNARY(栈保护) –金丝雀 又称为stack guard
1
金丝雀,以前矿工进入矿坑时候会带一只金丝雀下去,如果矿坑内有有毒气体,金丝雀就会鸣叫甚至死亡,同样这个canary也是缓冲区溢出攻击一种检测手段,当启用栈保护后,函数开始执行的时候会先往栈里插入cookie(金丝雀)信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。
DEP
- NX(DEP)(数据执行保护 Data Execution Prevention)
1
2NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
可执行的地方不能写,可写的地方不能执行
ASLR
1 | 内存地址随机化机制(address space layout randomization),有以下三种情况: |
PIE
- PIE (Position Independent Execution)
1
开启后,code与data都会跟着ALSR
RELRO
1 | Relocation Read-Only |