Leak-canary 简单绕过canary

leak-canary
提取码8ypi

这是从别人那里看见的,在看canary怎么绕过的时候看到的
别人的博客

他讲的感觉挺对,不过这个程序他利用的不是很充分,然后我就现学现卖一下了

在这里插入图片描述


这里好像严格来说至少有两个漏洞,一个是buf<read的大小,栈溢出;一个是printf格式化字符串漏洞。

根据canary的保护机制,他就是在栈里面放一段数,(应该是随机的吧)然后在函数返回的时候检查这段数还在不在、是否完整,如果有人通过栈溢出破坏了这一段数,程序就崩溃了。
这是一个简单的提,没绕那么多圈子,有个格式化字符串漏洞就可以把canary泄露出来

首先

在这里插入图片描述

v3这个数应该就是canary,然后ida里给的提示是距离栈底Ch,

在这里插入图片描述
被选中的地方就是栈底,在main函数返回值上面,然后栈底往回减去C

### Canary机制概述 栈金丝雀(Stack Canary)是一种用于检测缓冲区溢出的安全技术。其基本原理是在函数返回地址之前放置一个特定值(称为“金丝雀”),如果该值被修改,则表明发生了缓冲区溢出攻击[^1]。 在网络安全上下文中,绕过Canary保护通常涉及利用某些漏洞来规避这种安全措施。以下是几种常见的方法: 1. **覆盖其他变量而非直接破坏Canary** 攻击者可能通过精心设计输入数据仅覆盖目标内存区域中的非关键部分而不触及实际的Canary值,从而避免触发异常处理程序[^2]。 2. **泄露Canary值后再实施攻击** 如果存在信息泄漏漏洞,比如格式化字符串错误等,可以先读取到当前线程或进程内的Canary具体数值;之后再基于此构建精确控制流劫持所需的payload[^3]。 3. **利用已知固定Canary模式** 某些老旧系统可能存在未随机化的Canary实现方式,在这些情况下可以直接猜测或者枚举出正确的Canary序列号来进行后续操作[^4]。 下面给出一段Python伪代码展示如何尝试获取并应用泄露出来的canary value: ```python import struct def leak_canary(target_process): # 假设这里有一个能够造成信息泄露的功能调用 leaked_data = target_process.send_payload("%x." * 20) # 解析返回的数据找出canary所在位置 canary_value = int(leaked_data.split('.')[CANARY_POSITION], 16) return canary_value def craft_exploit(canary, buffer_size): nop_sled = b"\x90" * (buffer_size - len(shellcode)) shellcode = asm("mov $0xb,%al; mov %esp,%ebx; ...") # 构造shellcode address_to_jump = struct.pack("<I", RETURN_ADDRESS) exploit_payload = ( nop_sled + shellcode + struct.pack("<I", canary) + b"A"*(CANARY_PADDING_SIZE-len(struct.pack("<I", canary))) + address_to_jump ) return exploit_payload ``` 以上仅为理论上的演示,请勿非法测试任何真实环境下的软件和服务!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值