0x19 Protection
ASLR(地址随机化)
程序每一次执行的时候,heap、stack、library等的位置都不一样
检查是否开启ASLR
- cat /proc/sys/kernel/randomize_va_space
DEP/NX(数据执行保护)
- 可写的程序不可执行,可执行的程序不可写
PIE(地址无关可执行文件)
gcc在默认情况下没有开启,编译时加上 -fPIC -pie就可以开启
没开启时程序的data段以及code段会是固定的
一旦开启以后data以及code也会随着ASLR,因此没有固定的位置可以跳就会变的困难许多
Stack Guard
编译器对stack overflow的一种保护机制
在函数被调用时,先在stack上放canary
函数返回前先检查这个值有没有被修改
可以有效的防止缓冲区溢出攻击
ROP
一种利用现有的程序片段组合出想要功能的技巧
可以使用ROP解除DEP限制,然后执行shellcode
可以使用ROP绕过ASLR限制
可以使用ROP绕过Stack Guard
可以使用ROP绕过PIE
- ROP
- Gadget: 一小段以ret结尾的code
- ROP Chain: 串联在一起的Gadget,组合出需要的功能
- Gadget执行完后,还可以继续return
- 只要在stack上按正确的顺序排列好每一个gadget的address和对应的stack frame,就可以执行复杂的功能
- 类型
- 控制寄存器做syscall
- 使用原程序里的function
- 使用libc里的gadget或function(绕过ASLR)
- 查找ROP
- ROPgadget –binary ./xxx
- ROPgadget –binary ./xxx –opcode cd80c3(int 0x80 ; ret)