1.在函数刚开始执行时会设成一个标志,这个标志会入栈,当程序执行完之后,他会校验canary值是不是会发生变化,如果发生变化,说明程序被改过,发生异常,如果没改过就正常
这个在突破时我们用canary去泄露,canary是一个随机的值,每次程序执行他都是一个变量,核心就是每次执行时泄露一下,然后去拼接我们的shellcode
2.正常情况下能够在堆栈中加上我们shellcode的代码,但如果堆栈没有执行权限,shellcode就不能执行
3.函数地址随机化
堆喷射就是在堆栈里加很多shellcode,程序执行到任何一个shellcode都会执行获取shell
4.got表不可改
Canary保护
第一行参数:所有程序都会加上canary保护
第二行:只有函数中有char这样数组的才会给你加上canary保护
第三行:禁止canary保护
-m32:编译成32位程序
-o0:不进行任何优化
Canary.c:我们要编译的文件
-o:要输出文件
B:打断点