
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:打断点
第三行:查看寄存器的值(ebp)
第四行:查看栈里的数据
目标程序

不加保护时
第二句做内存对齐用
可以减少读取次数
如下图:一次读取四个字节,对齐之前我们先读取a,再读取三个b,最后b还有再读最后一个字节;如果时对齐之后,直接分两次读完a和b

第一行和第三行是为了保护main方法的,确保main执行完后返回到哪里
调试看一下
反汇编主函数后在最开始的地方下断点
R、n起来

现在esp的地址相当于栈里的ret,覆盖就要覆盖它
执行前三行代码对我们的esp是没有影响的,第一行和第三行是为了保护我们的esp的,避免受第二行的影响

加canary后:+17,+23
此时eax已经是我们的canary值了
发现尾号1300的canary值

xor异或比较,如果正常则下一命令,如果错误跳转到call那里执行异常程序
输入东西动态调试看看canary的值
它这个默认printf打印format+4的位置


%08x被加入到前面的format变成字符串了

第二个程序

看我们输入的字符串在栈中距离canary有多远,从而读取其值

往下取到第十五个就是canary的值即尾号d5dc的位置

获取内存地址

Canary地址,08x是取8位
在构造payload前还要计算偏移量
从d5bc的输入开始覆盖,先覆盖dc的canary的值,再覆盖ret值
写脚本时忘了函数可以写入print dir(开头字母)
Canary要翻转改成小端序
本文介绍了Canary保护机制,用于防止栈溢出攻击。主要内容包括:Canary的设置与验证过程,如何利用Canary泄露shellcode,堆栈执行权限的重要性,函数地址随机化,以及在不同情况下的Canary保护效果。通过实例分析了如何计算偏移量以绕过Canary保护,以及在实际操作中需要注意的细节。
1197

被折叠的 条评论
为什么被折叠?



